为什么我不能在 C 中定义大小的数组上使用 realloc?



我有一个关于 C 语言内存分配的非常基本的问题。 如果我写:

int* test;
test = malloc(5 * sizeof(int));
test[0] = 1;
test[1] = 2;
test[2] = 3;
test[3] = 4;
test[4] = 5;
test = realloc(test, 6 * sizeof(int));

我能够使用realloc。如果我将测试定义为:

int test[5] = {1,2,3,4,5};

我无法在上面调用realloc

这些语句之间的较低级别差异是什么? 我可以在测试中以某种方式重新分配[5]吗? 如何免费测试[5]?

我不确定在哪里寻找答案,如果您可以链接资源,我将不胜感激。

你不能使用realloc()int test[5],因为这个test不是通过内存管理函数(如malloc())分配的指针,也不是NULL

引用自 N1570 7.22.3.5 realloc 函数:

如果 ptr 是空指针,则 realloc 函数的行为类似于 指定大小。否则,如果 ptr 与内存之前返回的指针不匹配 管理功能,或者如果空间已通过调用空闲或 Realloc函数,行为未定义。如果新对象的内存不能 分配后,旧对象不会释放,其值保持不变。

您无法重新分配int test[5]。(至少没有标准方法,但我不能说没有支持它的扩展编译器)。

要释放int test[5],如果它是一个局部变量,则退出声明该块的块。此类变量具有自动存储持续时间,并且在退出块时释放。如果是全局(或静态局部)变量,请退出进程,操作系统将释放进程使用的内存。

您无法更改大小,因为int test[5] = {1,2,3,4,5};中的test类型是int[5]。数字5是其类型的一部分,C 中的对象在创建后不能更改类型。

int* test;中,test是一个指针,它可以指向任意个连续int的内存区域。

最新更新