C++: string = NULL gives SEGFAULT 11?

C++: string = NULL gives SEGFAULT 11?

本文关键字:SEGFAULT gives NULL string C++      更新时间:2023-10-16

我今天修改了我的项目,允许它在不同的文件夹中保存文件,我发现我的程序在启动时崩溃了:

Segmentation fault: 11

因为我在测试程序之前引入了很多更改,我开始注释我添加的所有函数,但没有帮助。我甚至把

cout << "hello world" << endl;
return 0;

作为int main()的前两行,它仍然崩溃而没有显示任何内容。

最后,我花了一个小时才找出错误。修改包括声明一个全局变量

string foldername = NULL;

上面这行看起来很简单,它只是声明了一个全局变量。

然后我尝试了一个简单的程序:

#include <string>
std::string a = NULL;
int main(){
    return 0;
}

并且在启动时崩溃

为什么将字符串全局变量声明为NULL会使程序在没有任何信息的情况下静默崩溃?

std::string -与从C char*继承的字符串相反-始终保存有效的字符串。它可以为空,但不能为NULL。如果您尝试用NULL初始化std::string,它将尝试盲目地从NULL地址复制c类字符串,这是未定义的行为。

只使用

std::string a;

,然后a将被初始化为空字符串。

NULL只分配给指针类型,在C中也是如此。c++的方式是std::nullptr_tnullptr。声明指向字符串的指针,如

std::string * a = nullptr;

或者留给字符串构造函数

std::string a = "";    // equivalent to std::string a;