在C中释放三维数组时的SIGTRAP

时间:2012-04-06 12:06:19

标签: c pointers multidimensional-array malloc free

我正在尝试释放一个代表bmp图像的三维指针数组,并且它编译好了我在调试时在gdb中获得了SIGTRAP信号。我的错误信息是

  

警告:HEAP [bmpsample.exe]:
  警告:0061FFB8处的堆块在0061FFCC处修改超过c。的请求大小   程序接收信号SIGTRAP,跟踪/断点陷阱。 ntdll中的0x7787704e5!TpWaitForAlpcCompletion()
  来自ntdll.dll

在加载bmp文件中的值后释放数组时发生错误。我的代码如下。

分配:

int ***alloc3D(int xlen, int ylen, int zlen) {
int i, j, ***array;
if ((array = malloc(xlen*sizeof(int**)))==NULL) {
    perror("Error in first assignment of 3D malloc\n");
}
// Allocate pointers for each row
for (i = 0; i < xlen; i++) {
    if ((array[i] = malloc(ylen*sizeof(int*)))==NULL){
        perror("Error in second assignment of 3D malloc\n");
    }
    // Allocate pointer for each column in the row
    for (j=0; j < ylen; j++) {
        if((array[i][j] = malloc(zlen*sizeof(int)))==NULL) {
            perror("Error in third assignment of 3D malloc\n");
        }
    }
}

填充数组

int ***readBitmap(FILE *inFile, BmpImageInfo info, int*** array) {
    // Pixels consist of unsigned char values red, green and blue
Rgb *pixel = malloc( sizeof(Rgb) );
int read, j, i;
for( j=0; j<info.height; j++ ) {
    read = 0;
    for( i=0; i<info.width; i++ ) {
        if( fread(&pixel, 1, sizeof(Rgb), inFile) != sizeof(Rgb) ) {
                printf( "Error reading pixel!\n" );
        }
        array[j][i][1] = (int)(pixel->red);
        array[j][i][2] = (int)(pixel->green);
        array[j][i][3] = (int)(pixel->blue);
        read += sizeof(Rgb);
    }

    if ( read % 4 != 0 ) {
        read = 4 - (read%4);
        printf( "Padding: %d bytes\n", read );
        fread( pixel, read, 1, inFile );
    }
}
free(pixel);

return array;

}

取消分配

void dealloc3D(int*** arr3D,int l,int m)
{
    int i,j;

    for(i=0;i<l;i++)
    {
        for(j=0;j<m;j++)
        {
                free(arr3D[i][j]);
        }
        free(arr3D[i]);
    }
    free(arr3D);
}

我怀疑问题在于将RGB值从unsigned char转换为int,但我没有看到其他方法。如果我只是将整数值分配给分配的数组,那么释放它们就没有问题。

1 个答案:

答案 0 :(得分:2)

您遇到第一个fread声明

的问题
fread(&pixel, 1, sizeof(Rgb), inFile)

正在读取指针pixel,而不是pixel指向的内容。在那之后,任何pixel的使用都可能破坏堆(或其他东西)。