如何在C中的函数中使用realloc

Leg*_*dre 32 c arrays malloc

基于我在这里学到的东西:通过C中的函数操作动态数组.

void test(int data[])
{
    data[0] = 1;    
}    

int main(void)
{    
    int *data = malloc(4 * sizeof *data);

    test(data);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,我也试图realloc在函数中使用.

void increase(int data[])
{
    data = realloc(data, 5 * sizeof *data);    
}
Run Code Online (Sandbox Code Playgroud)

这符合但运行时程序崩溃.

我应该如何在函数中使用realloc?

我知道我应该将结果分配给realloc变量并检查它是否是NULL第一个.这只是一个简化的例子.

sim*_*onc 31

你想修改int*(你的数组)的值,所以需要将指针传递给你的increase函数:

void increase(int** data)
{
    *data = realloc(*data, 5 * sizeof int);
}
Run Code Online (Sandbox Code Playgroud)

然后调用代码看起来像:

int *data = malloc(4 * sizeof *data);
/* do stuff with data */
increase(&data);
/* more stuff */
free(data);
Run Code Online (Sandbox Code Playgroud)

  • 当心内存泄漏!正如此处提到的 /sf/answers/3084992781/ 您需要使用临时指针来检查 realloc 返回值 (3认同)

Ram*_*uri 7

请记住指针和数组之间的区别.
数组是堆栈中的内存,就是这样.如果你有一个数组:

int arr[100];
Run Code Online (Sandbox Code Playgroud)

然后arr是内存的地址,但是&arr是内存的地址,并且内存地址是常量,不存储在任何位置.所以你不能说arr = NULL,因为arr不是指向某个东西的变量.它只是一个符号地址:数组开始的地址.而不是指针有自己的内存,可以指向内存地址.

将int []更改为int*就足够了.
此外,变量通过复制传递,因此您需要将int**传递给函数.

关于如何使用realloc,所有的教学示例包括:

  1. 使用realloc;
  2. 检查它是否为NULL.在这种情况下使用perror并退出程序;
  3. 如果它不是NULL则使用分配的内存;
  4. 当你不再需要时释放内存.

所以这将是一个很好的例子:

int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc,
              // casting is optional but I'd suggest it for readability
assert(chuck);
for(unsigned int i=0; i<10; i++)
{
    chunk[i]=i*10;
    printf("%d",chunk[i]);
}
free(chunk);
Run Code Online (Sandbox Code Playgroud)


小智 5

两个代码都有很大的问题,如果你使用同一个指针从realloc发送和接收,如果失败,你会丢失你的指针来释放它。

你应该做这样的事情:

{ ... ...

more = realloc(area , size);
if( more == NULL )
    free(area);
else
    area=more;
Run Code Online (Sandbox Code Playgroud)

……

}

  • 失败时你会“释放(区域)”。如果重新分配失败,我可以继续使用“area”,而不是释放它吗? (4认同)