const 变量的存储位置
const 变量的存储位置不是绝对的只读区这是 C/C 面试/学习高频易错点核心结论const 只修饰「只读权限」不直接决定存储位置变量放哪里由变量的「作用域/生命周期」决定。一、分情况讲清楚C/C 通用1. 全局 const 变量 / 静态 const 变量// 全局 const const int g_val 10; int main() { // 静态 const static const int s_val 20; return 0; }✅存储位置只读数据段.rodata✅特性程序运行期间不能修改强行修改会段错误/崩溃。2. 局部 const 变量栈上int main() { // 局部 const const int a 10; return 0; }✅存储位置栈区stack❌不是只读区✅特性语法上不能直接改但可以通过指针绕过 const 强行修改C语言。这是最容易踩坑的地方栈上的 const 变量物理上不是只读的。3. 字符串字面值const char*const char* str hello;✅存储位置只读数据段✅特性绝对不能修改修改直接崩溃。二、关键误区澄清误区 1const 只读区❌ 错const 是编译期约束告诉编译器「这个变量不能被直接赋值」只读区是运行期内存属性由操作系统限制写入。误区 2局部 const 不能被修改❌ C语言里可以用指针绕开#include stdio.h int main() { const int a 10; int* p (int*)a; *p 20; // 强行修改 printf(%d\n, a); // 输出 20 return 0; }✅ 运行成功因为 a 在栈上不是只读内存。C 对 const 优化更强局部 const 可能被优化成立立即数不一定能修改。误区3const 让它不能改❌ 错const 只是语法限制真正不让改的是操作系统的内存保护机制。真相编译器看到全局 const就把它安排到只读段操作系统加载程序时给只读段打上“禁止写入”标签你用指针修改 向只读地址写数据 操作系统强制执行崩溃。三、一张表总结变量类型存储位置是否真正只读能否强行修改全局 const / 静态 const只读数据段✅ 是❌ 不能崩溃局部 const栈栈区❌ 不是✅ 可以Cconst char* 字符串只读数据段✅ 是❌ 不能崩溃总结const 不决定存储位置只限制语法赋值权限只有全局/静态 const、字符串常量会放进只读区局部 const 变量在栈上物理可写只是语法不让改。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2453036.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!