此函数在读取原始像素值时抛出访问冲突,我无法弄清楚原因。 可以认为这是我的代码运行的唯一部分,我已经使用相同的结果运行此独奏。
string filenames[]={"firstclick.raw", "secondclick.raw","thirdclick.raw","fourthclick.raw","fifthclick.raw","sixthclick.raw","seventhclick.raw","eighthclick.raw"};
FILE *file;
int height= 750, width = 453, bbp=3;
unsigned char ****images;
images = (unsigned char ****)malloc(sizeof(unsigned char ***)*8);
for(int j = 0; j<8; j++){
images[j] = (unsigned char ***)malloc(sizeof(unsigned char**)*height);
for(int i = 0; i<height; i++){
images[j][i]= (unsigned char **)malloc(sizeof(unsigned char*)*width);
for(int k = 0; k<bbp; k++)
images[j][i][k]= (unsigned char *)malloc(sizeof(unsigned char)*bbp);
}
}
for (int i = 0; i<8; i++){
if (!(file=fopen(filenames[i].c_str(),"rb"))){
cout << "Cannot open file: "<<filenames[i].c_str() <<endl;
exit(1);
}
fread(images[i], sizeof(unsigned char), height*width*bbp, file);
fclose(file);
}
答案 0 :(得分:1)
当您在内存中的不同位置分配内存块时,该结构上的内容将无效。
而是分配一个大块,然后将指针设置为指向块内部,这样就可以使用fread。
答案 1 :(得分:1)
这里的问题是你已经将数组的每个元素分配为一个单独的数组(在内存中的其他位置,其位置保持为指针)。但是当你读入时,你会认为它是一个连续的块。您将覆盖所有这些指针,并溢出缓冲区以启动。
如果您希望images
成为一组离散的内存块,请按以下方式分配:
unsigned char ** images;
int i;
images = malloc( sizeof(unsigned char *) * 8 );
for( i = 0; i < 8; i++ ) {
images[i] = malloc( width * height * bpp );
}
请注意,sizeof(unsigned char)
由标准定义为始终为1.您无需始终乘以sizeof(unsigned char)
。
现在,要获取图像中的像素地址,您需要乘以(通常是行主要):
unsigned char * pixel = images[i] + (y * width + x) * bpp;
unsigned char r = pixel[0];
unsigned char g = pixel[1];
unsigned char b = pixel[2];