3D阵列的内存分配和C结果中fread的使用


// 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],sizeof(unsigned char),1,fp);
fread(&image[i][j][2],sizeof(unsigned char),1,fp);




}

}

正如你从上面看到的,我正在尝试声明一个3d数组,它将包含bmp图像的像素信息。fp指针指向包含数据的二进制文件。

我的问题是,当我试图使用动态内存分配在图像表中得到错误的结果时(这意味着即使我在这里没有包含的其余代码是正确的,也会打印一个空白图像(,这怎么可能呢。另一方面,当我删除代码的A部分并将其替换为";无符号字符图像[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*/ }

最新更新