网易首页 > 网易号 > 正文 申请入驻

C++中char*指针是否涉及堆内存?揭秘背后的真相

0
分享至

你想知道在char *p = "world";这句代码中是否用到了堆空间,核心结论先明确:没有用到堆空间—— 这句代码里的内存分配涉及代码区(只读数据段)栈区,完全和堆(heap)无关。

一、逐行拆解内存分布

我们把char *p = "world";拆成两个部分,清晰看每部分的内存位置:

1. "world" 字符串常量 → 代码区(只读数据段)

  • "world" 是字符串常量(不可修改),C++ 会把它存储在程序的代码区(只读数据段 / RODATA),而非堆 / 栈。
  • 代码区的特点:只读(修改会触发程序崩溃)、程序启动时分配、退出时释放,由操作系统管理。
2. 指针变量 p → 栈区
  • p 是一个char*类型的局部变量(假设在函数内定义),存储在栈区,它的作用是保存字符串常量"world"在代码区的首地址。
可视化内存分布:

plaintext

代码区(只读):  "world\0"  (地址:0x1000)栈区:           p = 0x1000  (指针p存栈上,指向代码区的字符串)堆区:           无任何分配 ❌
二、关键验证:修改字符串常量会崩溃(证明不在堆 / 栈)

堆 / 栈的内存是可读写的,但代码区的字符串常量是只读的,尝试修改会直接触发程序崩溃:

cpp

运行

#includeusing namespace std;int main() {char *p = "world";p[0] = 'W'; // ❌ 试图修改只读数据段的内容,程序崩溃(段错误/Segmentation Fault)cout << p << endl;return 0;

如果"world"在堆 / 栈上,修改是合法的;正因为它在只读的代码区,所以修改会报错。

三、易混淆的对比:什么时候才用到堆?

只有显式用new/malloc动态分配内存时,才会用到堆。对比下面两种写法:

代码写法

是否用堆

内存分布

能否修改

char *p = "world";

❌ 不用

p 在栈,"world" 在代码区(只读)

不能修改

char *p = new char[6]; strcpy(p, "world");

✅ 用堆

p 在栈,堆上分配 6 字节存 "world"

可以修改

char p[] = "world";

❌ 不用

整个数组在栈上(可读写)

可以修改

补充说明第三种写法:

cpp

运行

int main() {char p[] = "world"; // 栈上分配6字节,把"world\0"拷贝到栈上p[0] = 'W'; // ✅ 合法,输出"World"cout << p << endl;return 0;
四、C++11 后的规范写法(避坑)

char *p = "world"; 其实是 C++11 后被标记为废弃(deprecated)的写法,因为它允许非 const 指针指向只读常量,容易引发修改崩溃。

推荐规范写法

cpp

运行

const char *p = "world"; // 明确标记字符串常量为只读,编译器会拦截修改操作
总结
  1. 核心结论:char *p = "world"; 完全没用到堆空间 —— 指针p在栈区,字符串常量"world"在代码区(只读数据段);
  2. 关键区分:只有用new/malloc动态分配内存时,才会用到堆;栈上的数组char p[] = "world"也和堆无关;
  3. 规范建议:C++11 及以上版本,务必用const char*指向字符串常量,避免因误修改导致程序崩溃。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
央视火速曝光:全是假货!别再往家里搬了,很多人天天在用!

央视火速曝光:全是假货!别再往家里搬了,很多人天天在用!

云舟史策
2026-03-05 17:54:39
伊朗官员:美国媒体在撒谎!伊朗没有向美国发送任何信息

伊朗官员:美国媒体在撒谎!伊朗没有向美国发送任何信息

西游日记
2026-03-05 14:03:18
以总理发言人:伊朗每天都在向以色列发射多次导弹攻击,并多次直接击中居民区,耶路撒冷等地均传出防空警报

以总理发言人:伊朗每天都在向以色列发射多次导弹攻击,并多次直接击中居民区,耶路撒冷等地均传出防空警报

观威海
2026-03-05 22:11:14
关键时刻,中国给伊朗开放北斗服务。

关键时刻,中国给伊朗开放北斗服务。

荆楚寰宇文枢
2026-03-05 23:16:13
Unity官宣:全球商店移除中国开发者资源!

Unity官宣:全球商店移除中国开发者资源!

3DM游戏
2026-03-04 09:18:05
多家车企大降价,我听到一片欢呼

多家车企大降价,我听到一片欢呼

新行情
2026-03-05 15:00:34
有些地方机关事业单位退休人员退休金因为绩效奖金均摊到月而增加

有些地方机关事业单位退休人员退休金因为绩效奖金均摊到月而增加

郭爱华追问教育
2026-03-05 06:29:26
重磅:一吨重导弹命中以色列,美军或损失2架U2侦察机!

重磅:一吨重导弹命中以色列,美军或损失2架U2侦察机!

胜研集
2026-03-05 19:53:34
全国人大代表赵皖平回应“延长春节假期”建议被落实

全国人大代表赵皖平回应“延长春节假期”建议被落实

大象新闻
2026-03-05 16:11:05
湖南卫视元宵晚会直播发生意外,一名表演嘉宾在完成舞台动作时意外失误撞向何炅,何炅:这是要给我拜个晚年吗

湖南卫视元宵晚会直播发生意外,一名表演嘉宾在完成舞台动作时意外失误撞向何炅,何炅:这是要给我拜个晚年吗

极目新闻
2026-03-04 09:59:45
“寿司郎吃出金枪鱼寄生虫卵”,北京门头沟区市监局通报

“寿司郎吃出金枪鱼寄生虫卵”,北京门头沟区市监局通报

观察者网
2026-03-05 08:25:16
在MWC上,小米展示AI下半场的另一种路径

在MWC上,小米展示AI下半场的另一种路径

36氪
2026-03-05 21:35:11
伊朗发射携带1吨重弹头的导弹打击以色列

伊朗发射携带1吨重弹头的导弹打击以色列

新华社
2026-03-05 19:08:15
反转了?千问林俊旸离职疑有内幕,网友曝他阻碍阿里招更多牛人

反转了?千问林俊旸离职疑有内幕,网友曝他阻碍阿里招更多牛人

派大星纪录片
2026-03-05 15:28:49
万万没想到!两会最火提案不是医疗和就业,而是霍启刚的这一举动

万万没想到!两会最火提案不是医疗和就业,而是霍启刚的这一举动

米果说识
2026-03-05 17:59:27
全国政协委员张凯丽:建议统一并简化演员署名体系,扭转“唯番位论”畸形风气

全国政协委员张凯丽:建议统一并简化演员署名体系,扭转“唯番位论”畸形风气

封面新闻
2026-03-05 12:24:38
全国政协委员袁小彬:建议取消私家车年审制度,实施远程监测

全国政协委员袁小彬:建议取消私家车年审制度,实施远程监测

南方都市报
2026-03-05 17:28:05
日本政府紧张研判:派自卫队去霍尔木兹海峡

日本政府紧张研判:派自卫队去霍尔木兹海峡

都市快报橙柿互动
2026-03-05 13:57:55
一舞封神后,被400亿东莞首富收入囊中,如今已是7岁孩子的妈妈

一舞封神后,被400亿东莞首富收入囊中,如今已是7岁孩子的妈妈

往史过眼云烟
2026-03-05 17:46:46
伊朗:禁止美以欧船只通过霍尔木兹海峡

伊朗:禁止美以欧船只通过霍尔木兹海峡

新华社
2026-03-05 16:37:04
2026-03-06 01:56:49
呼呼历史论
呼呼历史论
分享有趣的历史
423文章数 16537关注度
往期回顾 全部

科技要闻

独家|林俊旸辞职 我们和认识他的人聊了聊

头条要闻

伊朗:已作好准备应对美国地面行动

头条要闻

伊朗:已作好准备应对美国地面行动

体育要闻

不开玩笑,没人想在季后赛碰上黄蜂

娱乐要闻

谢娜下场撕薛之谦,张杰前女友爆猛料

财经要闻

“十五五”开局之年,这么干!

汽车要闻

15.98万元起 第三代领克03大尾翼版上市

态度原创

艺术
家居
旅游
教育
公开课

艺术要闻

他偏要画最难的部分——这位韩国画师,只画手脚与人体,惊艳了无数人!

家居要闻

奶白柔境 闲卧享时光

旅游要闻

云南兰坪向阳山坡长出“空中民宿”,两地共建现代农业产业园探路农文旅融合

教育要闻

只有成为了爱本身,才能真正理解无条件的爱!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版