微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

3D 数组的内存分配和 fread 在 C 结果中的使用

如何解决3D 数组的内存分配和 fread 在 C 结果中的使用

// A part of Code
 int dim1=height;
 int dim2=width;
 int dim3=3;
    
 int k;
 
  unsigned char *** image = (unsigned char  ***)malloc(dim1*dim2*3);

        for (i = 0; i< dim1; i++) {

             image[i] = (unsigned char  **)malloc(dim2*sizeof(unsigned char  *));

          for (j = 0; j < dim2; j++) {

              image[i][j] = (unsigned char  *)malloc(dim3*sizeof(unsigned char ));
          }

        }




// B part of Code
  for (i = 0; i < height; i++) {
        
           for (j = 0; j < width; j++) {
               
                   
        fread(&image[i][j][0],sizeof(unsigned char),1,fp);
        fread(&image[i][j][1],fp);
        fread(&image[i][j][2],fp);
         
          
                   
         
           }
        
    }

从上面可以看出,我试图声明一个 3d 数组,该数组将包含 bmp 图像的像素信息。 fp 指针指向包含数据的二进制文件

我的问题是,当我尝试使用动态内存分配进行 fread 以在图像表中得到错误的结果时,怎么可能(这意味着即使我没有在此处包含的其余代码是正确的,也会打印空白图像)。 另一方面,当我删除代码的 A 部分并将其替换为“unsigned char image[height][width][3]”时,它会起作用。

那么我在内存分配或 fread 的使用中做错了什么?因为显然问题就在那里。

为了方便起见,我们假设大小为 252x252x3。

解决方法

typedef struct
{
    unsigned char R;
    unsigned char G;
    unsigned char B;
}RGB;

void *allocateReadImage(size_t width,size_t height,FILE *fi)
{
    RGB (*picture)[width] = malloc(sizeof(*picture) * height);

    if(picture && fi)
    {
        if(fread(picture,sizeof(*picture),height,fi) != height)
        {
            free(picture);
            picture = NULL;
        }
    }
    return picture; 
}

用法:

RGB *mypicture = allocateReadImage(1600,1200,inputfile);
if(!mypicture) { /*some error handling*/ }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。