在C中为数组动态分配内存

时间:2014-10-15 01:47:39

标签: c arrays malloc

我将内存分配给一个数组(使用malloc),但如果它需要更多空间,是否有可能在程序中稍后扩展数组?或者可能创建一个新数组并让第一个数组中的最后一个元素指向新数组? 我知道realloc会更容易使用,但我只是尝试使用malloc

3 个答案:

答案 0 :(得分:3)

一般算法是

allocate array of 100
while more input
    if no-room-in-array
        allocate another array 100 bigger than the current array
        copy values from current array into newly created array
        free(current array)
        current array = newly created array (the one you copied into)
    // now there will be room, so
    put input in array

答案 1 :(得分:1)

是的,您可以使用realloc()。注意在之前检查返回值,然后将其分配给原始指针。见这里:https://stackoverflow.com/a/1986572/4323

答案 2 :(得分:1)

错误的尺寸传递给malloc()

代码不应传递n字节,而应传递n * sizeof(int)

// int *array1=(int *)malloc(100);
int *array1 = malloc(100 * sizeof *array1);

// int *newArray=(int *)malloc(size+100);
int *newArray =  malloc((size+100) * szeof *newArray);

其他想法包括

1)无需投射

    int *array1 = (int *) malloc(...;
    int *array1 = malloc(...);

2)使用memcpy()

简化
    // for(i=0; i<size; i++) newArray[i]=array1[i];
    memcpy(newArray, array, size * sizeof *newArray);

3)一定要free()

4)new是一个C ++运算符,这是C,使用malloc()

5)size_t使用int而不是size

6)以指数方式增长,而不是线性增长

// int *newArray=(int *)malloc(size+100);
size_t newsize = size*3/2;
int *newArray = malloc(newsize);

7)检查malloc()失败

int *newArray = malloc(newsize);
if (newArray == NULL && newsize > 0) Handle_Failure();