基于我在这里学到的东西:Manipulating dynamic array through functions in 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);
}
这符合,但程序运行时崩溃。
Question我应该如何在函数中使用 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 是内存的地址,也是 & amp;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
ert(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;
……
}
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(54条)