当我们试图获取NULL字符串的长度时,为什么会出现运行时错误



为什么下面的代码会出现错误?

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

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

我知道会发生运行时错误,因为我正在尝试获取空字符串的长度,但我想知道为什么会发生这种情况?

您调用std::string构造函数的以下重载(重载5(:

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

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

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

因此,您在工作中有未定义的行为。回到你的问题,这超出了对";"为什么会发生";,因为UB可以导致任何结果。你可能想知道为什么它一开始就被指定为UB——这是因为std::string在设计上应该使用C风格的零终止字符串(char*(。然而,NULL不是一个。空的、以零结尾的C样式字符串是例如""

为什么下面的代码会出现错误?

必须声明main才能返回int

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

这将编译:

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

附带说明:请阅读为什么我不应该#include <bits/stdc++.h>

没有空字符串,除非通过"空";你的意思是空的,而不是空的。

相关内容

最新更新