【问题标题】:Why runtime error occur when we try to get the length of the NULL string?当我们尝试获取 NULL 字符串的长度时,为什么会出现运行时错误?
【发布时间】:2021-02-28 16:37:49
【问题描述】:

为什么下面的代码会报错?

 // This a CPP Program 
#include <bits/stdc++.h> 
using namespace std; 
  

// Driver code 
 main() 
{ 
    string s=NULL;
    s.length();
}

我知道会发生运行时错误,因为我试图获取空字符串的长度,但我想知道为什么会这样?

【问题讨论】:

  • 没有空字符串这样的东西(除非“null”是指空的,但你不知道)。您正在尝试使用具有未定义行为的空指针初始化字符串。
  • 我的建议是使用string s; 默认构造函数已经将字符串初始化为空字符串。
  • 这不是有效的 C++。 main 需要 int 返回类型。
  • “我知道会发生运行时错误...” 未定义的行为不需要这样。 "...因为我正在尝试获取空字符串的长度..." 这是不正确的,运行时错误发生在此之前。 "...但是我想知道为什么会这样?"因为程序无效,因为它有未定义的行为,因为代码将NULL传递给字符串构造函数.

标签: c++ string pointers


【解决方案1】:

您调用std::string constructor 的以下重载(重载 5):

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

这是属于构造函数的解释(强调我的):

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

因此,您在工作中有未定义的行为。回到您的问题,这排除了关于“为什么会发生”的任何进一步想法,因为 UB 可以导致任何事情。您可能想知道为什么首先将其指定为 UB - 这是因为 std::string 在设计上应使用 C 样式、以零结尾的字符串 (char*)。但是,NULL 不是其中之一。空的、以零结尾的 C 风格字符串是例如"".

【讨论】:

    【解决方案2】:

    为什么下面的代码会报错?

    main 必须声明为返回int

    另外,要声明一个空字符串,请将其设为 string s;string s="";

    这将编译:

    #include <iostream>
    #include <string>
    
    int main() 
    { 
        std::string s;
        std::cout << s.length() << '\n'; // prints 0
    }
    

    附注:请阅读Why should I not #include &lt;bits/stdc++.h&gt;?

    【讨论】:

      【解决方案3】:

      没有空字符串之类的东西,除非“null”是指空的,但你不是。

      【讨论】:

      • 尝试建设性,增加知识,也将帮助那些在未来寻找答案的人。
      猜你喜欢
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2022-12-05
      • 2011-10-20
      • 1970-01-01
      相关资源
      最近更新 更多