当我写这段代码时,一切似乎都很完美
string *s;
s=new string("some_string");
*(s+1) = *s;
但当我更换" some_string"空白我的程序抛出segmetation错误。为什么会发生这种情况并且有办法解决它?
s=new string("");
答案 0 :(得分:-1)
我认为问题是你的代码的最后一行,因为*(s + 1)应该在之前,当#34; some_string"之前产生错误或异常。被初始化为字符串。将指针初始化为* s
时,(s + 1)处不会出现任何字符串答案 1 :(得分:-1)
程序的输出取决于编译器。
表达式*(s+1)
的类型是字符串,因此您使用*(s+1) = * s
执行的操作是:首先,您尝试将*(s+1)
强制转换为字符串,然后尝试将该字符串分配给*s
,它将调用该新转换字符串的复制构造函数。
当字符串不为空时,编译器可能会分配比存储*s
数据所需内存更多的内存(“some_string”),并且字符串中的复制功能仅运行其实际数据(“ some_string“)这意味着它不会访问任何比*s
分配的内存更多的内存。
但是当字符串为空时,编译器不会分配那么多内存,这会导致段错误。
因此,程序的结果可能取决于编译器,它们如何为std::basic_string
保留数据以及它们如何存储数据。