读取.raw文件时fread()始终返回0,free()释放指针时程序崩溃
问题根源
你的代码存在两个核心错误:
- 结构体内部的
UCHAR* image指针未分配内存:你仅为IMAGE结构体本身申请了内存,结构体中的image指针是未初始化的野指针,没有指向合法可写的内存空间。fread尝试向非法地址写入数据时直接触发错误返回0,后续对野指针执行free操作也必然触发程序崩溃。 - 缺少文件打开结果校验:如果
fopen因路径错误、权限不足等原因打开文件失败,后续的fread调用也会直接返回0。
修复方案
你需要在调用fread前为image指针分配足够大小的内存,同时增加必要的错误判断逻辑,修复后的read_image函数参考如下:
IMAGE *read_image() { IMAGE* img; FILE* fpI; int height = 1409; int width = 1690; int freadReturn; size_t data_size = height * width * sizeof(UCHAR); fpI = fopen("file.raw", "rb"); // 新增文件打开失败判断 if (fpI == NULL) { printf("open file failed\n"); return NULL; } img = (IMAGE*)malloc(sizeof(IMAGE)); if (img == NULL) { fclose(fpI); return NULL; } img->height = height; img->width = width; // 新增:为image指针分配内存 img->image = (UCHAR*)malloc(data_size); if (img->image == NULL) { free(img); fclose(fpI); return NULL; } freadReturn = fread(img->image, sizeof(UCHAR), data_size, fpI); printf("fread() returns : %d", freadReturn); fclose(fpI); return img; }
同时建议在主函数中增加返回值判断,避免read_image返回空指针时后续free操作出错:
int main() { IMAGE *img = read_image(); if (img != NULL) { free(img->image); free(img); } return 0; }
内容的提问来源于stack exchange,提问作者The Walrus
相关产品推荐
相关产品推荐

