基于我在这里学到的东西:通过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)
请记住指针和数组之间的区别.
数组是堆栈中的内存,就是这样.如果你有一个数组:
int arr[100];
Run Code Online (Sandbox Code Playgroud)
然后arr是内存的地址,但是&arr是内存的地址,并且内存地址是常量,不存储在任何位置.所以你不能说arr = NULL,因为arr不是指向某个东西的变量.它只是一个符号地址:数组开始的地址.而不是指针有自己的内存,可以指向内存地址.
将int []更改为int*就足够了.
此外,变量通过复制传递,因此您需要将int**传递给函数.
关于如何使用realloc,所有的教学示例包括:
所以这将是一个很好的例子:
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)
……
}