【发布时间】:2020-09-16 07:53:54
【问题描述】:
#include <stdio.h>
int main() {
char *name = "Thank you";
name[0] = 'a';
printf("%s", name);
}
而且效果很好:
我的理解是name[0] = 'a' 应该不起作用。
那么它为什么有效呢?
【问题讨论】:
标签: c string pointers char string-literals
#include <stdio.h>
int main() {
char *name = "Thank you";
name[0] = 'a';
printf("%s", name);
}
而且效果很好:
我的理解是name[0] = 'a' 应该不起作用。
那么它为什么有效呢?
【问题讨论】:
标签: c string pointers char string-literals
C 标准对尝试修改字符串文字没有任何限制。但是,如果您尝试修改字符串文字,则结果为 undefined behaviour。
引用C11,第 6.4.5 章(字符串文字)/P7
[...] 如果程序尝试修改这样的数组,则行为未定义。
您认为程序允许您修改字符串文字的内容这一事实是 UB 的众多结果之一。
【讨论】:
您的理解几乎是正确的,程序确实格式不正确,但这并不意味着它应该出现故障或失败,它会调用未定义的行为。
不幸的是,未定义行为的可能症状之一是程序表现出应有的行为。
N1570 ISO/IEC 9899:201x §3.4.3 中描述的未定义行为
1 未定义的行为
在使用本国际标准没有要求的不可移植或错误程序结构或错误数据时的行为。
2 注意
可能的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(无论是否发出诊断消息),到终止翻译或执行(发出诊断消息)。
【讨论】: