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

解析Elegoo Mars 4 .goo文件时fread读取第二层数据异常求助

解析Elegoo Mars 4 .goo文件时第二层读取错误的解决方法

问题核心诊断

你的代码存在指针访问越界问题,这是导致第二层数据读取错误、段错误的直接原因。

在fread_goo_layer_content的循环中,你用&dst[i]->definition获取第i层结构体地址,但dst是goo_layer_content_t **类型(指向数组的指针),dst[i]会让二级指针本身偏移i个goo_layer_content_t*的长度,而非访问数组内的第i个元素。第一次循环(i=0)碰巧能工作(dst[0]等于*dst),但第二次循环(i=1)会访问完全错误的内存地址,直接破坏数据读取流程。

修复代码

修改fread_goo_layer_content的循环部分,正确访问数组元素:

int  fread_goo_layer_content(goo_layer_content_t **dst, goo_header_info_t *header, FILE *fp){
  // Jump to layer content segment
  if(fseek(fp, header->offset_of_layer_content, SEEK_SET)) return 0;

  *dst = (goo_layer_content_t*)calloc(header->total_layers, sizeof(goo_layer_content_t));
  if(*dst == NULL) return 0;

  // 用临时指针简化数组访问逻辑
  goo_layer_content_t *layers = *dst;
  // Loop through all layers and read their layer info
  for(int i=0; i < header->total_layers; i++){
    // 正确指向数组第i个元素的definition字段
    if(!fread_goo_layer_definition(&layers[i].definition, fp) ) return 0;

    // Reading image data
    ...
  }
  return 1;
}

也可以直接修正指针访问,不使用临时变量:

// 替换循环内的调用行
if(!fread_goo_layer_definition(&(*dst)[i].definition, fp) ) return 0;

验证逻辑

  • 修正后,layers[i].definition(或(*dst)[i].definition)会正确指向数组第i个goo_layer_content_t结构体的definition字段,内存访问不再越界。
  • 结合你之前的调试结果(文件偏移量正确、前204168字节读取正常),修正后fread_le会正确读取文件中3C A3 D7 0A的二进制数据,而非错误的40 A3 D7 0D。

额外注意事项

  • 确认#pragma packed作用范围正确,避免结构体因内存对齐导致字段偏移错误(当前问题并非对齐导致,但需保持警惕)。
  • 后续读取image_data时,需遵循同样的指针访问逻辑,避免重复踩坑。

内容的提问来源于stack exchange,提问作者GrandNecro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:22:05