0

这是我的代码:

#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 对整个数组进行排序。但我什至不能创建一个正常的可编辑结构。

4

2 回答 2

5

您正在阅读一个char没有指向任何地方的指针。没有空间存储读取的字符。

使用 a 更容易std::string,因为它会自动调整自身大小以保存输入中的旧字符。

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

cin>>model;
cin>>assembler;
cin>>processorInt;
于 2012-09-06T20:19:49.210 回答
2

这两个版本都不起作用,您正在尝试将数据读入未初始化的指针。仅仅声明 egchar* model;会给你一个未初始化的指针:它可以指向内存中的任何位置。当您尝试使用在该位置存储字符串时,cin >>您将写入不属于您的内存。这可能会出现段错误,或者它可能看起来有效。

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

char model[MAX_STRING_LENGTH];

或者使用 malloc,但请注意,稍后您将需要free此内存:

char *model = malloc(MAX_STRING_LENGTH);

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

但绝对更喜欢std::string改用:如果你这样做,那么你不需要自己为字符串提供空间,你的代码根本不需要改变太多。

于 2012-09-06T20:20:53.147 回答