如何在C中的函数中使用realloc
基于我在这里学到的知识: 这个很好用。但是,我也尝试在函数中使用如何在C中的函数中使用realloc,c,arrays,malloc,C,Arrays,Malloc,基于我在这里学到的知识: 这个很好用。但是,我也尝试在函数中使用realloc void increase(int data[]) { data = realloc(data, 5 * sizeof *data); } 这符合要求,但程序在运行时崩溃 问题 我应该如何在函数中使用realloc 我知道我应该将realloc的结果分配给一个变量,并首先检查它是否为NULL。这只是一个简化的示例。您想修改int*(您的数组)的值,因此需要将指向该值的指针传递到递增函数中: void
realloc
void increase(int data[])
{
data = realloc(data, 5 * sizeof *data);
}
这符合要求,但程序在运行时崩溃
问题
我应该如何在函数中使用realloc
我知道我应该将
realloc
的结果分配给一个变量,并首先检查它是否为NULL
。这只是一个简化的示例。您想修改int*
(您的数组)的值,因此需要将指向该值的指针传递到递增
函数中:
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*,就足够了此外,变量是通过copy传递的,因此需要向函数传递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);
int*chuck=(int*)realloc(NULL,10*sizeof(int));//像malloc一样行事,
//铸造是可选的,但我建议它的可读性
断言(查克);
对于(unsigned int i=0;i这两个代码都是非常有问题的,如果您使用相同的指针从realloc发送和接收,如果失败,您将丢失指针以稍后释放它
你应该这样做:
{
...
。。。
}我不敢相信你没有对malloc()
的返回值进行强制转换,而且你还正确地使用了sizeof()
操作符…太棒了!+1.欢迎。信不信由你,每次我遇到标记为c
的问题时,我都(而且必须)准备好应付类似char*p=(char*)malloc(len*sizeof(char)这样的混乱局面;
,这至少在3个地方是错误的(练习:找出位置)。@H2CO3-冒着听起来像傻瓜的风险:1.在malloc之前的演员阵容是没有必要的,2.sizeof*p相当于sizeof(char),在更改类型时更有用,3.它缺少一个右括号“?哦,那么它是4!是的,我确实错过了右括号(第0个错误)第一个:勾选,第二个:由于sizeof(char)
始终为1,这会造成混乱并降低可读性,第三个:如果您使用sizeof()
,您应该真正使用sizeof(*variable)
而不是sizeof(type)
,因为当您更改*p
的类型时,后者将中断。啊,我对编程比较陌生,没有意识到它是sizeof(char)的标准1.今天学到了一些东西。感谢有趣的练习!+1软件内存泄漏!如本文所述,您需要使用临时指针来检查realloc返回值。如果realloc失败,我可以继续使用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);
more = realloc(area , size);
if( more == NULL )
free(area);
else
area=more;