You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 09:39:03