You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:54:00