【问题标题】:Initializing pointer to array of strings in c++在 C++ 中初始化指向字符串数组的指针
【发布时间】:2017-11-03 22:17:24
【问题描述】:

当我编写这段代码时,一切似乎都很完美

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

但是当我用空白替换“some_string”时,我的程序会引发分段错误。为什么会发生这种情况,有办法解决吗???

s=new string("");

【问题讨论】:

  • 你想用*(s+1) = *s;做什么?
  • 你为什么使用new 只是为了创建空字符串?
  • *(s+1) 不是字符串。
  • *(s+1) 不存在。 s 指向单个字符串,因此s + 1 处没有字符串。
  • 看起来你真正想要的是std::vector<std::string>

标签: c++ arrays string pointers initialization


【解决方案1】:

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

表达式*(s+1) 的类型是字符串,所以您对*(s+1) = * s 的操作是:首先,您尝试将*(s+1) 转换为字符串,然后尝试将该字符串分配给*s,这将调用新转换的字符串的复制构造函数。

当字符串不为空时,编译器分配的内存可能超过了存储*s的数据(“some_string”)所需的内存,而字符串中的复制函数只运行它的真实数据(“some_string” ) 这意味着它不会访问比*s 分配的内存更远的任何内存。

但是当字符串为空时,编译器并没有分配那么多内存,导致段错误错误。

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

【讨论】:

  • 这个答案非常具有误导性。代码只是未定义的行为。在考虑 SSO 时,不涉及强制转换,不存在复制构造函数调用,甚至在实现细节方面对崩溃的解释也不一定正确。
【解决方案2】:

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

【讨论】:

  • 当您超出数组范围时,编译器不需要发出警告/错误。也不需要抛出异常。您可以期望的最好结果是段错误或内存违规。
  • @NathanOliver 如果数组大小超过指定的大小或尝试访问的内存多于分配的内存,它不会生成 arrayoutofbound 异常吗?
  • @LogicalRetard:C++ 中没有“arrayoutofbound 异常”。您一定在考虑 Java 或 C#。语言错误!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2015-04-28
  • 2015-08-03
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多