C++:为什么我会出现分段错误

C++: Why I get Segmentation Fault?

本文关键字:分段 错误 为什么 C++      更新时间:2023-10-16

这是我的代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;
struct Computer
{
    char * model;
    char * assembler;
    int processorInt;
};
int main()
{
    Computer comp;
    char* model;
    char* assembler;
    int processorInt;
    cin>>model;
    cin>>assembler;
    cin>>processor int;
    comp.model = model;
    comp.assembler = assembler;
    comp.processorInt = processorInt;
    return 0;
}

//如果我这样做,它是有效的,但如果我用另一种方式,它会给出分段错误

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;
struct Computer
{
    char * model;
    char * assembler;
    int processorInt;
};
void setValues()
{
    Computer comp;
    char* model;
    char* assembler;
    int processorInt;
    cin>>model;
    cin>>assembler;
    cin>>processor int;
    comp.model = model;
    comp.assembler = assembler;
    comp.processorInt = processorInt;
}
int main()
{
    setValues();
    return 0;
}

那是什么原因呢?

我的目标是创建一个结构数组,在其中我可以保存关于每台"计算机"的一些信息,然后可以编辑任何结构,然后通过processorInt对整个数组进行排序。但我甚至不能创建一个正常的可编辑结构。

您正在读取一个不指向任何位置的char指针。没有空间存储读取的字符。

使用std::string要容易得多,因为它可以自动调整大小以保留输入中的旧字符。

Computer comp;
std::string model;
std::string assembler;
int processorInt;
cin>>model;
cin>>assembler;
cin>>processorInt;

这两个版本都不起作用,您正试图将数据读取到未初始化的指针中。仅仅声明例如char* model;就会留下一个未初始化的指针:它可以指向内存中的任何位置。当您尝试使用cin >>将字符串存储在该位置时,您将写入不属于您的内存。这可能会出错,也可能看起来有效。

仅仅声明char*并不能为字符串提供空间:如果你使用标准的C字符串,那么你需要给它们一些数据:使char指针数组具有固定大小,或者使用malloc来分配字符串缓冲区:

char model[MAX_STRING_LENGTH];

或者使用malloc,但要注意稍后需要free这个内存:

char *model = malloc(MAX_STRING_LENGTH);

现在,如果要同时使用标准的C字符串和cin,则根本不应该使用>>:没有办法限制输入大小。相反,使用以MAX_STRING_LENGTH为限制的cin.getline(有关详细信息,请参阅文档中的示例)。

但肯定更喜欢使用std::string:如果你这样做,那么你就不需要自己为字符串提供空间,你的代码也不需要做太多更改。