这是我的代码:
#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对整个数组进行排序。但我甚至无法创建一个正常的可编辑结构。
答案 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
:如果你这样做,那么你就不需要自己处理为字符串提供空间了,而且你的代码根本不需要改变太多。