2 c++ standards-compliance visual-studio visual-c++
此代码在MS Visual Studio中表现得很奇怪:
char *s = "hello";
s[0] = 'a';
printf(s);
Run Code Online (Sandbox Code Playgroud)
在启用优化的发布版本中,它忽略s [0] ='a'并打印"hello".如果没有优化或在调试版本中,它会因访问冲突而崩溃.
这种行为是符合c ++标准还是没有?在我看来,编译器应该只允许对字符串文字的常量引用,即
const char *s = "hello";
Run Code Online (Sandbox Code Playgroud)
编辑:我知道为什么它这样工作,我不明白为什么我被允许非const引用只读内存.
Fer*_*cio 14
不,这不是编译器中的错误.当你写:
char* s = "hello";
Run Code Online (Sandbox Code Playgroud)
字符串常量"hello"将放在只读部分中,如果您尝试修改它,则应生成异常.(OS异常,而不是C++异常).
要使其可写,您必须使用数组:
char s[] = { 'h', 'e', 'l', 'l', 'o', 0 };
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的需要一个指针,让它指向一个数组:
char _s[] = { 'h', 'e', 'l', 'l', 'o', 0 };
char* s = _s;
Run Code Online (Sandbox Code Playgroud)
我可以看到你的观点,即只允许使用字符串文字初始化const指针,但我认为这会破坏很多现有代码.
| 归档时间: |
|
| 查看次数: |
1499 次 |
| 最近记录: |