为什么下面的代码会出现错误?
// 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>
?
没有空字符串,除非通过"空";你的意思是空的,而不是空的。