为什么C语言中固定大小的数组无法使用realloc?
C语言两种数组定义的内存差异及相关问题解答
1. 两种声明方式的底层差异
- 第一种动态指针分配写法:
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));
test是存储在栈区的指针变量,存储的是堆内存区的首地址,这块内存是由malloc标准库函数分配的,库会额外记录这块堆内存的大小、使用状态等元数据,符合realloc/free的入参要求。
- 第二种定长数组写法:
int test[5] = {1,2,3,4,5};
test是数组名,本质是不可修改的常量指针,指向的内存区域取决于定义位置:如果在函数内定义就是栈内存区,如果定义在函数外或者加了static修饰就是静态存储区,这两块区域的内存都不是malloc系列函数分配的,也没有对应的堆内存管理元数据。
2. 能否对定长数组执行realloc
完全不可以。C标准明确规定realloc的第一个参数必须是NULL,或者之前由malloc/calloc/realloc返回的堆内存指针。传入定长数组的地址属于未定义行为,几乎都会触发程序崩溃或者内存损坏。
3. 定长数组的内存释放规则
定长数组不需要也不能手动调用free释放,回收逻辑由运行环境自动处理:
- 局部栈数组:函数执行结束、栈帧弹出时自动回收内存
- 全局/静态定长数组:在程序整个运行周期内常驻内存,程序退出后由操作系统统一回收
内容的提问来源于stack exchange,提问作者ahi
相关产品推荐
相关产品推荐

