【发布时间】:2012-01-25 03:20:40
【问题描述】:
据我了解,如果你想创建一个 c 字符串常量,你应该给出如下声明:
const char* str = "hello";
或
char* const str = "hello";
但是一个简单的声明,比如:
char* str = "hello"
如果我尝试以任何方式修改字符串 - 比如
str[2] = 'f';
或
*(str+2) = 'f';
我总是遇到分段错误,这是为什么呢?
另外,如果我做这样的声明
const char* const str = "hello";
str = "bye";
根据 scott meyers,我正在尝试修改 const 指针,应该得到警告、错误或段错误,但我什么也没得到,代码编译和执行完美。我很困惑,我在 ubuntu 11.10 上使用 g++。
【问题讨论】:
-
是的,我也很困惑。任何符合标准的编译器都应该拒绝显示的最后一个 sn-p 代码。如果你的没有,它包含一个错误。在责备编译器之前,请确保您没有忽略任何警告。
-
代码可以正确编译和执行,因为修改字符串文字会导致 未定义行为,这意味着所有安全赌注都已关闭,您的程序可能会工作或者可能会崩溃或显示任何奇怪的行为。未定义的行为意味着程序格式错误,并且可以显示可能会或可能不会被解释的行为。