所以我有这个功能:
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值,总是'0'in .BMPs)。它总是以分段错误结束,除非我在填充它时注释掉第一个控制变量并将其替换为0(因此代替'matrix [control] [control2] [control3]'''matrix [0] [control2] [ CONTROL3]')。
有什么想法吗?
答案 0 :(得分:1)
您的代码假定为sizeof(<pointer>) == sizeof(int)
。这并非总是如此,尤其是在64位平台上。这就是为什么你应该使用matrix=malloc(height*sizeof(int**));
这样的调用而不是你拥有的调用。我想检查fseek()
和malloc()
的retval也会有所帮助 - 至少放置assert(),这样你就会知道它有效。