运行以下代码时出现分段错误: -
char *p ="Hello";
*p = 'M';
我打算用"Hello"
替换字符串'M'
的第一个字符。但我得到分段错误。可能是什么原因?
答案 0 :(得分:2)
这是未定义的行为。为了与旧的C代码兼容,C ++编译器允许您将非const
指针指向字符串文字(例如,您的"Hello"
),但是您无法通过它们进行便携式写入。
最好使用:
const char* p = "Hello"; // if you really need a pointer, probably so you
// can move it within the text, point it at other
// text, set it to a NULL sentinel after use...
const char[] hello = "Hello"; // if you're really only interested in the text
答案 1 :(得分:1)
C ++和C中的任何字符串文字(例如代码中的"Hello"
)都是const char [6]
类型,可以隐式地分配给任何const char *
值:
const char * str="Hello";
表示它驻留在操作系统标记为只读的内存中(您应该收到编译器警告)。因此,当您尝试更改该内存位置时,将抛出异常。
编译器将其放入只读内存的原因是因为您可能在代码的不同部分使用另一个相同(或甚至类似)的字符串文字"Hello"
。通过将字符串文字的内存位置标记为只读,编译器只需要将字符串文字一次存储在内存中。
另请注意,C ++标准不要求编译器将字符串文字放入只读内存中,只是说修改字符串文字是未定义的行为。但实际上,字符串文字存储在任何现代操作系统或编译器的只读存储器中。
答案 2 :(得分:0)
编译器将“Hello”字符串放入只读内存段并为其指定一个指针。允许您将指针分配给char*
这一事实是为了向后兼容。 C ++声明它是未定义的行为。
如果要更改字符串,请按以下方式声明:
char p[]="Hello";