解析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
相关产品推荐
相关产品推荐

