【发布时间】:2010-10-09 08:35:15
【问题描述】:
这段代码在 MS Visual Studio 中的行为很奇怪:
char *s = "hello";
s[0] = 'a';
printf(s);
在启用优化的发布版本中,它会忽略 s[0] = 'a' 并打印“hello”。如果没有优化或调试版本,它会因访问冲突而崩溃。
这种行为是否符合 C++ 标准?在我看来,编译器应该只允许对字符串文字的常量引用,即
const char *s = "hello";
编辑:我知道为什么会这样,但我不明白为什么允许我对只读内存进行非 const 引用。
【问题讨论】:
-
其他人认为字符串在只读内存中是正确的,但我很惊讶当您尝试覆盖只读字符串时程序不会崩溃。
-
为什么每个人都认为他们理解事物的失败构成了事物的错误?
-
在 asm 列表中,我看到优化器只是丢弃 s[0] = 'a' 并直接调用 printf("hello")。
-
哇,真的吗?这听起来像是一个编译器错误,它会抛出这样的非平凡代码。
标签: c++ visual-studio visual-c++ standards-compliance