【问题标题】:Why can't I use realloc on arrays of defined size in C?为什么我不能在 C 中定义大小的数组上使用 realloc?
【发布时间】:2021-10-14 03:44:23
【问题描述】:

我对 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 只能使用动态分配的内存。第二个不是(它是静态的或自动的 - 取决于上下文)
  • 因为数组不是指针。
  • 数组有固定的位置.. realloc 给你一个可能指向不同地址的指针
  • “我如何免费测试[5]?”你没有。你没有分配它,所以你不能释放它。编译器分配它,编译器分配的内存永远不会被释放。
  • 一个例外是使用灵活的数组成员作为struct 中的最后一个成员。为结构分配内存,以包含所需的数组长度。

标签: c memory malloc realloc


【解决方案1】:

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

引用N1570 7.22.3.5 realloc 函数:

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

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

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

【讨论】:

  • 谢谢,如果我在函数中定义了test [5],如果返回则释放内存?
  • @AntonHinneck 绝对。函数内部声明的所有变量(除非由static 限定)在函数返回时自动释放。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,这完全有道理。
  • realloc()返回的新分配的部分内存没有初始化。
猜你喜欢
  • 1970-01-01
  • 2019-10-25
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 2019-04-28
相关资源
最近更新 更多