【问题标题】:Error on string '\0' null while concatenating连接时字符串 '\0' null 出错
【发布时间】:2019-08-13 23:01:49
【问题描述】:

所以我试图连接简单的字符串,然后做一个最后的句子。

int main()
{
    string I ("I");
    string Love ("Love");
    string STL ("STL,");
    string Str ("String.");
    string fullSentence = '\0';

    // Concatenate
    fullSentence = I + " " + Love + " " + STL + " " + Str;
    cout << fullSentence;

    return 0;
}

在这里,我不想让“fullSentence”什么都没有,所以我分配了 null,它给了我一个错误。没有确定的错误消息,除了以下我根本不明白的......:

executive_4.exe 中的 0x51C3F6E0 (ucrtbased.dll) 引发异常:0xC0000005:访问冲突读取位置 0x00000000。发生了

只要我删除“\0”,它就可以正常工作。为什么会这样?

【问题讨论】:

  • 不清楚你想用string fullSentence = '\0'; 完成什么。如果你想要一个空字符串,只需使用string fullSentence;
  • @interjay 是的,这就是我所做的,但我想知道为什么 '\0' 不起作用。

标签: c++ string null


【解决方案1】:

"\0" 代替'\0'。在 C++ 中,'' 用于字符,"" 用于字符串。

这是从char 到非标量类型std::string 的转换

【讨论】:

    【解决方案2】:

    您可以使用调试器查看所发生情况的调用堆栈。 查看字符串类here 在您的情况下调用了以下构造函数:

    basic_string( const CharT* s, const Allocator& alloc = Allocator() );
    

    根据构造函数的描述(强调我的)构造 内容用 的副本初始化的字符串 s 指向的以空字符结尾的字符串。的长度 字符串由第一个空字符确定。 行为是 如果 [s, s + Traits::length(s)) 不是有效范围,则未定义

    在您的情况下,范围为空 -> 无效。

    【讨论】:

      【解决方案3】:

      对我来说,这似乎是一个 MSVC 编译器错误。

      声明:

      string fullSentence = '\0';
      

      不应该编译。


      确实,从char(即'\0')到std::string 之间没有有效的(隐式)构造函数。 Reference Here.


      请注意,gccclang 不接受此代码为有效。 MSVC 会。


      为什么会这样?

      查看汇编代码,MSVC 使用以下构造函数编译该语句:

      std::string::string(char const * const);
      

      '\0'作为参数传递,实际上会转换成nullptr

      所以:

      用 s 指向的以空字符结尾的字符串的副本初始化内容来构造字符串。字符串的长度由第一个空字符确定。如果 [s, s + Traits::length(s)) 不是有效范围(例如,如果 s 是空指针),则行为未定义。

      所以你的代码是未定义的行为。

      【讨论】:

      • 感谢您提供如此详细的信息。我现在明白了很多!
      猜你喜欢
      • 2012-06-03
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 2023-03-18
      • 2011-02-24
      • 2011-09-05
      相关资源
      最近更新 更多