c - 为什么我不能在 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));
我能够使用重新分配。如果我将测试定义为:
int test[5] = {1,2,3,4,5};
我无法调用realloc。
这些语句之间的较低级别的区别是什么?我可以以某种方式重新分配测试 [5] 吗?我如何免费测试[5]?
我不确定在哪里寻找答案,如果您可以链接资源,我将不胜感激。
解决方案
您不能使用realloc()
to ,int test[5]
因为这test
不是通过内存管理函数(如malloc()
)或NULL
.
引自N1570 7.22.3.5 realloc 函数:
如果 ptr 是空指针,则 realloc 函数的行为类似于指定大小的 malloc 函数。否则,如果 ptr 与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 函数被释放,则行为未定义。如果无法为新对象分配内存,则不会释放旧对象并且其值不变。
您不能重新分配int test[5]
. (至少没有标准方法,但我不能说没有支持它的扩展编译器)。
要 free int test[5]
,如果它是一个局部变量,则退出声明它的块。这样的变量具有自动存储持续时间,并且在退出块时被释放。如果它是全局(或静态局部)变量,则退出进程,操作系统将释放进程使用的内存。
推荐阅读
- terraform - 如何自动颁发由 Terraform 创建的 AWS ACM 证书?
- c++ - 如何在c ++中创建结构向量的映射
- android-studio - 如何使此类在屏幕上同时显示多个错误?(使用数组)
- datetime - 为唯一时间戳 Pyspark 分配一个 ID
- atom-editor - 如何使用更漂亮的原子增加 Atom 中的线长?
- java - 从表单中选择输入 - 每次提交都会更改
- c++ - 如果是一个类的私有数据成员并且我们创建该类的两个对象,那么指向 int 数据类型的指针是什么?
- python - 如何根据变量(例如日期)循环访问 URL?
- python-3.x - python中的嵌套if语句
- ios - XXX 不支持 Azure 构建管道中的配置文件