Я пытаюсь освободить трехмерный указательный массив, представляющий изображение 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, но я не вижу другого способа сделать это. Если я просто присваиваю целые значения выделенному массиву, нет проблем с их освобождением.
Вы научились правильно использовать 'gdb'? Вы запрашивали обратную трассировку (используя команду 'bt'' gdb'), когда происходит 'SIGTRAP'? Вы скомпилировали свой код с помощью 'gcc -Wall -g'? –
Вы развращаете память. Измените 'fread (& pixel, 1, sizeof (Rgb), inFile)' to 'fread (pixel, 1, sizeof (* pixel), inFile)' и 'read + = sizeof (Rgb);' to 'read + = sizeof (* пикселей); '. Таким образом, когда и/или если изменяется тип 'pixel', в вашем коде будет меньше изменений. – JimR
@BasileStarynkevitch Я компиляю с '-Wall' и' -g' без ошибок, а bt показывает, что 'dealloc3D' вызывается с правильным адресом массива и правильной высотой и шириной. Однако я очень новичок в GDB, и я знаю только основные элементы управления. –