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

C语言变量内存分配疑问:编译器预分配还是运行时分配?

C语言变量内存分配机制详解

不同类型变量的分配时机完全不同,分三类说明:

  • 全局变量、静态变量(static修饰):
    这类变量在编译链接阶段就完成内存分配,存储在全局/静态存储区,从程序启动到结束一直占用内存,和函数是否被调用无关。比如全局定义的int global_val;或者函数内的static int static_val;,编译时就已经为它们预留好空间。

  • 普通局部自动变量(比如你例子里的int x = 20;):
    这类变量属于函数栈帧的一部分,只有当函数被调用时,程序才会在栈上为其分配内存;函数执行完毕返回后,对应的栈帧被销毁,这块内存会被标记为可复用(相当于释放)。如果函数从未被调用,这个变量根本不会占用任何内存——因为栈是程序运行时动态生成栈帧的,没调用函数就不会生成对应栈帧,自然不会为x分配空间。

  • 动态分配内存(malloc/calloc/realloc):
    这类内存是在程序运行时,程序员手动调用分配函数才从堆上申请的,完全由开发者控制分配和释放(需用free回收)。和函数调用、变量作用域无关,只要调用malloc成功,就会在堆上获得一块内存,直到调用free才会被释放。

补充:malloc的典型使用场景

  • 编译时无法确定所需内存大小(比如根据用户输入的长度创建数组);
  • 需要内存在函数返回后仍然保留(局部栈内存会随函数返回销毁,堆内存不会);
  • 需要申请大块内存(栈空间通常有大小限制,堆的可用空间更大)。

内容的提问来源于stack exchange,提问作者Guilherme Cintra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:49:53