【问题标题】:Segmentation fault when using a tridimensional dynamic matrix使用三维动态矩阵时的分段错误
【发布时间】:2014-12-25 16:12:00
【问题描述】:

所以我有这个功能:

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 (所以不是 'matrix[control][control2][control3]' 它的 'matrix[0][control2][控制3]')。

有什么想法吗?

【问题讨论】:

  • height*sizeof(int**), width*sizeof(int*)
  • 并且不要转换malloc()的返回值

标签: c dynamic matrix segmentation-fault malloc


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-22
    • 2013-04-05
    • 2017-02-07
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多