在这里学习的基础上:通过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,所有的教学示例包括:
- 使用realloc
- 检查它是否为NULL。在这种情况下,使用perror并退出程序
- 如果不是NULL,则使用分配的内存
- 当你不再需要记忆时,释放它
所以这将是一个很好的例子:
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;
…
}