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

读取.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:18:05