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

Why can't I use realloc on arrays of defined size in C?

我有一个关于 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

这些语句之间的下层区别是什么? 我能以某种方式在 test[5] 上重新分配吗? 如何免费测试[5]?

我不知道去哪里寻找答案,如果你能link一个资源,我将不胜感激。

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

引自N1570 7.22.3.5 realloc函数:

If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size. Otherwise, if ptr does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to the free or realloc function, the behavior is undefined. If memory for the new object cannot be allocated, the old object is not deallocated and its value is unchanged.

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

要释放 int test[5],如果它是局部变量,则退出声明它的块。这样的变量有一个 自动存储持续时间 并且在退出块时被释放。如果它是全局(或静态局部)变量,则退出进程,OS 将释放进程使用的内存。

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

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