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

时间:2011-11-05 10:37:08

标签: c++ null char

我写了这个简短的程序

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

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

谢谢!

2 个答案:

答案 0 :(得分:8)

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

请改为尝试:

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

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

答案 1 :(得分:1)

如果您使用C ++,为什么不使用std::string::substr

#include <iostream>
#include <string>
int main () {
  std::string c = "abcd";
  std::string d = c.substr(0,2);
  std::cout << d << std::endl;
  return 0;
}

程序的输出:

 ab