C++读取二进制文件存储的struct数组时出现Segmentation Fault报错
错误原因
- 数组类型声明错误:你声明的
Card *cardArray[numcards]是Card指针数组,每个元素存储的是指向Card对象的地址,而非Card对象本身。你直接把二进制文件里的Card结构体数据写入这个指针数组,相当于给所有指针赋值为非法的野地址,后续通过->访问成员就会触发野指针访问,导致段错误。 - 读取操作的目标地址错误:
arch.read((char*)&cardArray, numcards*sizeof(Card));这里的读取目标是指针数组的内存空间,而你实际需要的是能存放numcards个Card对象的内存空间,两者的内存布局、大小都不匹配。 - 非标准语法使用:C++标准不支持栈上的变长数组(VLA),你用变量numcards作为数组长度属于编译器扩展,代码可移植性差;另外原代码遗漏了
iostream(cout依赖)、cstdlib(exit函数依赖)头文件,编译阶段就存在隐患。
修正方案
直接声明存储Card对象的数组即可,调整后的代码如下:
#include <iostream> #include <string> #include <fstream> #include <cstdlib> using namespace std; struct Card{ char symbol; int color; int id; }; int main(){ const int numcards = 12; // 加const变成常量表达式,符合C++数组长度要求 Card cardArray[numcards]; // 改成Card对象数组,不是指针数组 ifstream arch; arch.open("casoPruebaParte1.dat", ios::binary); if(!arch.is_open()){ cout<<"Error al abrir el archivo\n"; exit(1); } // 读取目标改成cardArray的首地址,大小计算正确 arch.read((char*)cardArray, numcards*sizeof(Card)); for(int i=0; i<numcards; i++ ){ cout << cardArray[i].id << endl; // 对象用.访问成员,不是-> } arch.close(); return 0; }
内容的提问来源于stack exchange,提问作者javiera
相关产品推荐
相关产品推荐

