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

C语言中局部、全局声明的const在内存布局中的存储位置是哪里?

C语言const变量的内存存储位置

你问题中的结论在主流x86/x86_64平台、默认编译配置下基本成立,但C标准本身没有规定const变量的具体存储位置,实际存储规则由编译器、操作系统、编译选项共同决定,通用情况如下:

全局const变量

  • 通常存储在内存的只读数据段(.rodata段),属于进程地址空间的数据段范畴,该区域的内存权限为只读,尝试修改会直接触发段错误。
  • 特例:如果全局const变量同时被volatile修饰,或者编译器关闭了所有优化,部分编译器会将其放入普通可写数据段,避免常量折叠优化。

局部const变量(函数/代码块作用域内声明)

  • 通常存储在栈区,属于运行时动态分配的内存,本身具备可写权限,const的只读限制仅在编译期生效,若通过指针强行修改该变量,语法层面可以运行,不会触发内存访问错误,但属于C标准规定的未定义行为。
  • 特例:如果局部const变量是编译器可确定值的常量表达式(比如const int a = 10;),且编译器开启了O2及以上优化,该变量可能会被直接做常量折叠,不会实际分配内存,代码中所有调用位置会直接替换为字面量;如果是需要动态赋值的局部const(比如const int a = rand();),则一定会分配在栈上。

提示:如果需要确认特定场景下的存储位置,最准确的方法是查看编译生成的汇编代码,或者分析可执行文件的段布局。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:51:03