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

时间:2012-09-06 20:16:34

标签: c++ segmentation-fault

这是我的代码:

#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;
}

那是什么原因?

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

2 个答案:

答案 0 :(得分:5)

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

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

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

cin>>model;
cin>>assembler;
cin>>processorInt;

答案 1 :(得分:2)

两种版本都不起作用,您尝试将数据读入未初始化的指针。只是声明例如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:如果你这样做,那么你就不需要自己处理为字符串提供空间了,而且你的代码根本不需要改变太多。