为什么我不能写string,而我*可以*写入string对象?

如果我定义下面的东西,

char *s1 = "Hello"; 

为什么我不能做下面的事情,

 *s1 = 'w'; // gives segmentation fault ...why??? 

如果我做下面的事情怎么办

 string s1 = "hello"; 

我可以做下面的事吗,

 *s1 = 'w'; 

因为"Hello"会创build一个const char []。 这衰减到const char*而不是char* 。 在C ++中,string是只读的。 你已经创build了一个指向这样一个文字的指针,并试图写入它。

但是,当你这样做

 string s1 = "hello"; 

你把const char *“hello”复制到s1 。 不同的是,在第一个例子中, s1 指向只读“hello”,而在第二个例子中,只读“hello”被复制到非常量s1 ,允许您访问复制string中的元素以执行所需的操作跟他们。

如果你想对char *做同样的事情,你需要为char数据分配空间并将hello复制到它

 char hello[] = "hello"; // creates a char array big enough to hold "hello" hello[0] = 'w'; // writes to the 0th char in the array 

string文字通常分配在只读数据段中。

因为Hello驻留在只读内存中。 你的签名实际上应该是

 const char* s1 = "Hello"; 

如果你想要一个可变缓冲区,那么声明s1char[]std::string重载operator [] ,所以你可以索引它,即s1[index] = 'w'

时间混淆事项:

 char s0[] = "Hello"; s0[0] = 'w'; 

这是完全有效的! 当然,这并不回答原来的问题,所以我们走:string文字是在只读内存中创build的。 也就是说,它们的types是char const[n] ,其中n是string的大小(包括终止的空字符,即string文字"Hello" n == 6 ,但为什么这个types可以使用初始化一个char const* ?答案是简单的向后兼容性,分别兼容到[旧] C代码:由const时间成为语言,很多地方已经初始化char*与string文字任何体面的编译器应警告这个滥用,但是。