2017-06-02 131 views
-2

字符串数组。当我写这篇文章的代码一切似乎工作完美初始化指针在C++

string *s; 
s=new string("some_string"); 
*(s+1) = *s; 

但是,当我更换“some_string”空白我PROGRAMM抛出segmetation故障。为什么会发生这种情况,并且有办法解决这个问题?

s=new string(""); 
+5

你想用'*(s + 1)= * s来做什么? – NathanOliver

+0

是的。所以* s和*(s + 1)是空字符串 –

+1

为什么你只用'new'来创建空字符串? – PaulMcKenzie

回答

-1

我认为问题是代码的最后一行,因为*(s + 1)应该在“some_string”初始化为字符串之前产生错误或异常。当你将指针初始化为*时,不会有任何字符串在(s + 1)处。* s

+1

当您离开数组边界时,不需要编译器发出警告/错误。也不需要抛出异常。最好的希望是seg故障或内存违规。 – NathanOliver

+0

@NathanOliver如果数组大小超过指定的内存大小或者尝试访问的内存大于分配的内存大小,它不会生成数组outoutof异常吗? –

+0

没有。请参阅:https://stackoverflow.com/questions/1239938/accessing-an-array-out-of-bounds-gives-no-error-why – NathanOliver

-1

程序的输出将取决于编译器。

类型表达*(s+1)的是字符串,所以你*(s+1) = * s做的是:首先,你试着投*(s+1)为一个字符串,那么你尝试分配一个字符串*s,将新调用的拷贝构造函数铸造的字符串。

当字符串不为空时,编译器可能会分配比存储*s的数据(“some_string”)所需内存更多的内存,并且字符串中的复制函数仅通过其真实数据(“some_string”)运行这意味着它不会访问比*s分配的内存更多的内存。

但是,当字符串为空时,编译器不会分配那么多的内存,这会导致段错误错误。

因此,程序的结果可能取决于编译器,他们如何为std::basic_string保留数据以及它们如何存储数据。

+0

这个答案很具误导性。该代码只是未定义的行为。没有涉及到投射,没有复制构造函数调用,甚至在实现细节方面对崩溃的解释在考虑SSO时不一定是正确的。 –