当前位置: 首页 > news >正文

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";
存储位置只读数据段
特性绝对不能修改,修改直接崩溃。

二、关键误区澄清

误区 1:const = 只读区?

❌ 错!
  • 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 可能被优化成立立即数,不一定能修改。

误区3:const 让它不能改

❌ 错!
const 只是语法限制,真正不让改的是操作系统的内存保护机制。
真相:
  • 编译器看到全局 const,就把它安排到只读段
  • 操作系统加载程序时,给只读段打上“禁止写入”标签;
  • 你用指针修改 = 向只读地址写数据 =操作系统强制执行崩溃。

三、一张表总结

变量类型
存储位置
是否真正只读
能否强行修改
全局 const / 静态 const
只读数据段
✅ 是
❌ 不能(崩溃)
局部 const(栈)
栈区
❌ 不是
✅ 可以(C)
const char* 字符串
只读数据段
✅ 是
❌ 不能(崩溃)

总结

  1. const 不决定存储位置,只限制语法赋值权限
  2. 只有全局/静态 const、字符串常量会放进只读区
  3. 局部 const 变量在栈上,物理可写,只是语法不让改。
http://www.jsqmd.com/news/541781/

相关文章:

  • OpenClaw开源贡献指南:为Qwen3-32B生态开发技能包
  • 如何利用虚拟摄像头技术:安卓用户的终极控制方案
  • Flutter资源管理全攻略:如何正确配置Android图标、启动图与本地图片资源
  • OpenClaw硬件选型指南:百川2-13B量化模型对消费级显卡的适配
  • 大数据毕业设计 hadoop+spark+kafka+hive动漫推荐系统 动漫数据分析 可视化 漫画推荐
  • Arduino嵌入式统计库:轻量级实时传感器数据分析
  • LaTeX党福音:5分钟搞定Elsevier修改稿上传(含自动页码优化技巧)
  • 闽北哥-柔弱胜刚强:真正的强者,从不硬碰
  • CH224X USB快充协议控制器深度解析与Arduino实战
  • 《铸梦之路》Unity自动化UI框架ZMUIFramework:从零构建高性能UI管理系统
  • 零基础玩转OpenClaw:GLM-4.7-Flash镜像体验指南
  • LeagueAkari:基于LCU API的英雄联盟自动化工具集架构设计与实战应用
  • C# 一维数组完全指南:从声明到实战应用
  • 无网环境部署:OpenClaw离线使用Qwen3.5-4B-Claude-GGUF教程
  • u-blox GPS与Vodafone AT指令双模解析库
  • 坐标xyz, 长宽高
  • Linux文件属性解析与ls -l命令实现
  • 3个核心功能:从效率瓶颈到资源整合的高效管理与智能处理指南
  • 从STM32到RK3588:嵌入式系统升级机制对比全解析
  • OpenClaw技能扩展指南:给nanobot添加QQ机器人通道
  • 做 GBase 8c 迁移适配时,我更先盯兼容模式、对象改造和 SQL 行为差异,而不是急着把数据先搬过去
  • OpenClaw文件处理:用GLM-4.7-Flash自动整理杂乱文档
  • Unity游戏开发:用Curvy Spline插件5分钟搞定物体曲线运动(附避坑指南)
  • hadoop+spark+Hive物流预测系统 物流数据分析可视化 Echarts可视化 Django框架 大数据
  • 把 cursor 的工具活动栏改成垂直形式
  • Mac M1芯片适配:OpenClaw运行百川2-13B-4bits量化版性能实测
  • Bypass Paywalls Clean技术全解析:突破付费内容限制的完整指南
  • 键值的两种写法对比(显式键值对与ES6简写),两种写法对 VS Code 代码转跳的细微差别
  • Win11Debloat:3步搞定Windows系统瘦身,让你的电脑重获新生!
  • 2026年知名的16号工字钢精选厂家 - 品牌宣传支持者