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
相关产品推荐
相关产品推荐

