所以我有这个函数:
int*** loadmatrix(FILE *pimage,int height,int width) {
int ***matrix;
int control,control2,control3;
matrix=(int***)malloc(height*sizeof(int));
for (control=0; control<height; control++) {
matrix[control]=(int**)malloc(width*sizeof(int));
}
for (control=0; control<height; control++) {
for (control2=0; control2<width; control2++) {
matrix[control][control2]=(int*)malloc(3*sizeof(int));
}
}
fseek(pimage,54,SEEK_SET);
for(control=0; control<height; control++) {
for(control2=0; control2<width; control2++) {
for(control3=0; control3<3; control3++) {
matriz[control][control2][control3]=fgetc(pimage);
fseek(pimage,1,SEEK_CUR);
}
fseek(pimage,1,SEEK_CUR);
}
}
return matrix;
}
它接收指向.BMP图像文件的FILE指针、图像的高度和宽度,并尝试创建一个动态三维矩阵来存储每个像素的RGB值(忽略Alpha矩阵,在.BMP中始终为"0")。除非我在填充第一个控制变量时注释掉它并将其替换为0,否则它总是以分段错误告终(因此,它的"matrix[0][control2][control3]"不是"matrix[control2][control[3]",而是"matrix[0][control2][control 3]")。
有什么想法吗?
您的代码假设sizeof(<pointer>) == sizeof(int)
。这并不总是正确的,尤其是在64位平台上。这就是为什么应该使用matrix=malloc(height*sizeof(int**));
之类的调用进行分配,而不是使用现有的调用。我想检查fseek()
和malloc()
的retval也会有所帮助——至少放assert(),这样你就会知道它是有效的。