C语言中修改字符串字面量为何会引发未定义行为?
为什么修改字符串字面量会导致未定义行为?
这个问题太经典了——我当年啃K&R的《C程序设计语言》时,也在这个点上纠结了好一阵!咱们一步步拆解清楚:
核心原因:字符串字面量的存储属性
当你写pmessage = "jhjhjh";时,这里的"jhjhjh"是字符串字面量,它在程序编译阶段会被编译器放到程序的**只读数据段(常量区)**里。这个区域的内存是被操作系统标记为只读的,目的是保护常量数据不被意外修改。
而指针pmessage只是存储了这个只读区域里第一个字符'j'的地址,你可以理解为它“指着”一块不能碰的内存。这时候如果你尝试写操作,比如pmessage[0] = 'a';,本质上是在试图修改只读内存,这直接违反了内存的访问权限,所以C标准把这种行为定义为未定义行为。
别搞混:指针指向字面量 vs 数组初始化
很多人会把这两种写法搞混,这里必须明确区分:
char *pmessage = "jhjhjh";:指针指向只读数据段的字面量,内容不可修改char pmessage[] = "jhjhjh";:字符串字面量被拷贝到栈上的数组中,数组内容是可修改的
什么是“未定义行为”?
C标准里的未定义行为,意思是标准没有规定程序会出现什么结果——它可能直接崩溃,可能看起来“正常运行”,可能输出奇怪的内容,甚至在不同编译器、不同操作系统上表现完全不一样。所以哪怕你某次修改后程序没崩溃,也绝对不能这么写,这是严重的错误。
K&R里说“仅涉及指针操作”,是在强调这里没有做字符串拷贝,只是让指针指向了字面量的地址;但他们特意提醒修改会导致未定义行为,就是在点出字面量的只读属性这个关键细节。
内容的提问来源于stack exchange,提问作者Kanishk Viman
相关产品推荐
相关产品推荐

