手动设置char*的结尾不起作用

Nov*_*tor 1 c++ null char

我写了这个简短的程序

int main(){
    char * c = "abcd";
    c[1] = '\0';
    cout << c << endl;
}
Run Code Online (Sandbox Code Playgroud)

并且它不起作用...实际上它编译程序但在运行时发生错误...为什么?我认为它将打印一个"a",因为"字符串"现在看起来像这样:"a0cd"所以在零之后它应该检测到字符串的结尾,对吧?那问题出在哪里?

谢谢!

Mys*_*ial 8

你不能修改那样的字符串文字.

试试这个:

int main(){
    char c[] = "abcd";
    c[1] = '\0';
    cout << c << endl;
}
Run Code Online (Sandbox Code Playgroud)

这背后的原因是字符串文字存储在全局内存中(通常在只读段中).修改它们是未定义的行为.但是,如果将它初始化为数组char c[] = "abcd",它将在堆栈中(而不是全局内存),因此您可以自由地修改它.

  • C标准对堆栈和全局内存没什么好说的,这是一个实现问题.应该足以说明标准不允许修改字符串文字. (7认同)