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

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

void test(int data[]) { data[0] = 1; } int main(void) { int *data = malloc(4 * sizeof *data); test(data); return 0; } 

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

 void increase(int data[]) { data = realloc(data, 5 * sizeof *data); } 

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

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

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

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

 void increase(int** data) { *data = realloc(*data, 5 * sizeof int); } 

调用代码看起来像:

 int *data = malloc(4 * sizeof *data); /* do stuff with data */ increase(&data); /* more stuff */ free(data); 

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

 int arr[100]; 

然后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); 

这两个代码都是非常有问题的,如果你使用相同的指针来发送和接收realloc,如果它失败了,你将丢失指针以便以后释放它。

你应该做这样的事情:

{……

 more = realloc(area , size); if( more == NULL ) free(area); else area=more; 

……

}