2012-04-06 3 views
0

Я пытаюсь освободить трехмерный указательный массив, представляющий изображение BMP, и компилирует его. Я получаю сигналы SIGTRAP в gdb при отладке. Мое сообщение об ошибкеSIGTRAP при освобождении трехмерного массива в C

предупреждение: КУЧА [bmpsample.exe]:
предупреждение: Heap блок в 0061FFB8 изменен в 0061FFCC мимо запрошенный размер с.
Запрограммированный сигнал SIGTRAP, Trace/breakpoint trap. 0x7787704e5 в NTDLL! 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; 

}

Deallocation

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); 
} 

Я suscpect, что проблема заключается в заливке значения RGB из unsigned char для int, но я не вижу другого способа сделать это. Если я просто присваиваю целые значения выделенному массиву, нет проблем с их освобождением.

+0

Вы научились правильно использовать 'gdb'? Вы запрашивали обратную трассировку (используя команду 'bt'' gdb'), когда происходит 'SIGTRAP'? Вы скомпилировали свой код с помощью 'gcc -Wall -g'? –

+0

Вы развращаете память. Измените 'fread (& pixel, 1, sizeof (Rgb), inFile)' to 'fread (pixel, 1, sizeof (* pixel), inFile)' и 'read + = sizeof (Rgb);' to 'read + = sizeof (* пикселей); '. Таким образом, когда и/или если изменяется тип 'pixel', в вашем коде будет меньше изменений. – JimR

+0

@BasileStarynkevitch Я компиляю с '-Wall' и' -g' без ошибок, а bt показывает, что 'dealloc3D' вызывается с правильным адресом массива и правильной высотой и шириной. Однако я очень новичок в GDB, и я знаю только основные элементы управления. –

ответ

2

У вас есть проблемы с первым fread заявление

fread(&pixel, 1, sizeof(Rgb), inFile) 

, который читает в указатель pixel, а не в то, что pixel указывает на. После этого любое использование pixel может привести к повреждению кучи (или что-то еще).

+0

Спасибо. Я осуществил изменения, но я все еще получаю то же сообщение об ошибке, либо 'предупреждение: КУЧА [BMPSample.exe]: предупреждение: Неверный адрес для RtlFreeHeap (00940000, 00941C80)' или 'предупреждение: КУЧА [BMPSample.exe]: предупреждение: блок кучи в 00941C78, измененный в 00941C8C, за прошлый запрошенный размер c' –

+0

Другой потенциальной проблемой является индексирование в 'array [j] [i] [3]'. В зависимости от типа 'Rgb', возможно, вы должны использовать индексы 0, 1 и 2 вместо 1, 2 и 3? –

+0

Да, спасибо Бо. Я просто понял это и изменил его, и теперь он работает безупречно. Я обвиняю его в том, что он слишком часто используется для индексирования Matlab. –

Смежные вопросы