当前位置:  开发笔记 > 编程语言 > 正文

Visual Studio C++编译器中的错误?

如何解决《VisualStudioC++编译器中的错误?》经验,为你挑选了2个好方法。

此代码在MS Visual Studio中表现得很奇怪:

char *s = "hello";
s[0] = 'a';
printf(s); 

在启用优化的发布版本中,它忽略s [0] ='a'并打印"hello".如果没有优化或在调试版本中,它会因访问冲突而崩溃.
这种行为是符合c ++标准还是没有?在我看来,编译器应该只允许对字符串文字的常量引用,即

const char *s = "hello";

编辑:我知道为什么它这样工作,我不明白为什么我被允许非const引用只读内存.



1> Ferruccio..:

不,这不是编译器中的错误.当你写:

char* s = "hello";

字符串常量"hello"将放在只读部分中,如果您尝试修改它,则应生成异常.(OS异常,而不是C++异常).

要使其可写,您必须使用数组:

char s[] = { 'h', 'e', 'l', 'l', 'o', 0 };

或者,如果你真的需要一个指针,让它指向一个数组:

char _s[] = { 'h', 'e', 'l', 'l', 'o', 0 };
char* s = _s;

我可以看到你的观点,即只允许使用字符串文字初始化const指针,但我认为这会破坏很多现有代码.


编写`char s [] ="Hallo"就足够了;`,不需要将字符串文字拼写为数组!

2> Konrad Rudol..:

首先允许此代码的原因(而不是要求声明为类型char const*)是对旧C代码的向后兼容性.

但是,严格模式下的大多数现代编译器都会对上面的代码发出警告!

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有