如何在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;

}

相关内容

  • 没有找到相关文章