为什么我不能写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";
如果你想要一个可变缓冲区,那么声明s1
为char[]
。 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文字任何体面的编译器应警告这个滥用,但是。