使用三维动态矩阵时的分段错误

时间:2014-10-29 19:37:59

标签: c dynamic matrix segmentation-fault malloc

所以我有这个功能:

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]')。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的代码假定为sizeof(<pointer>) == sizeof(int)。这并非总是如此,尤其是在64位平台上。这就是为什么你应该使用matrix=malloc(height*sizeof(int**));这样的调用而不是你拥有的调用。我想检查fseek()malloc()的retval也会有所帮助 - 至少放置assert(),这样你就会知道它有效。