C++:为什么我会出现分段错误
C++: Why I get 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;
}
那是什么原因呢?
我的目标是创建一个结构数组,在其中我可以保存关于每台"计算机"的一些信息,然后可以编辑任何结构,然后通过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
:如果你这样做,那么你就不需要自己为字符串提供空间,你的代码也不需要做太多更改。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?