2012-04-06 11 views
0

Ich versuche, ein dreidimensionales Zeigerarray zu befreien, das ein BMP-Bild darstellt, und wenn es kompiliert wird, bekomme ich SIGTRAP-Signale in gdb beim Debuggen. Meine Fehlermeldung istSIGTRAP beim Freigeben eines dreidimensionalen Arrays in C

Warnung: HEAP [bmpsample.exe]:
Warnung: Heap-Block bei 0061FFB8 geändert bei 0061FFCC Vergangenheit Größe von c angefordert.
Programm empfangenes Signal SIGTRAP, Trace/Breakpoint-Trap. 0x7787704e5 in ntdll! TpWaitForAlpcCompletion()
von ntdll.dll

Der Fehler tritt auf, wenn ich die Anordnung nach dem Laden in den Werten aus der BMP-Datei freizugeben. Mein Code ist wie folgt.

Allocation:

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

Füllen des Array

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; 

}

Ausplanung

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

I suscpect dass das Problem liegt aus den RGB-Werten im Guss unsigned char zu int, aber ich sehe keinen anderen Weg es zu tun. Wenn ich dem zugewiesenen Array einfach ganzzahlige Werte zuweise, gibt es kein Problem, sie zu befreien.

+0

Haben Sie gelernt, 'gdb' korrekt zu verwenden? Haben Sie nach dem Backtrace gefragt (mit dem Befehl 'bt' von' gdb'), wenn die 'SIGTRAP' auftreten? Hast du deinen Code mit 'gcc -Wall -g' kompiliert? –

+0

Sie verdirbt Speicher. Ändere 'fread (& pixel, 1, sizeof (Rgb), inFile)' in 'fread (Pixel, 1, sizeof (* pixel), inFile)' und 'read + = sizeof (Rgb);' to 'read + = sizeof (* Pixel); '. Auf diese Weise, wenn und/oder wenn sich der Typ von "Pixel" ändert, wird es weniger Dinge in Ihrem Code geben. – JimR

+0

@BasileStarynkevitch Ich kompiliere mit '-Wall' und' -g' ohne Fehler und bt full zeigt mir, dass 'dealloc3D' mit der korrekten Adresse zum Array und der richtigen Höhe und Breite aufgerufen wird. Ich bin jedoch sehr neu in GDB und ich kenne nur die grundlegendsten Kontrollen. –

Antwort

2

Sie haben ein Problem mit der ersten fread Aussage

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

, die in den Zeiger pixel lesen, nicht in dem, was pixel zu zeigt. Danach wird jede Verwendung von pixel wahrscheinlich den Heap (oder etwas anderes) beschädigen.

+0

Danke. Ich habe die Änderungen umgesetzt, aber ich immer noch die gleichen Fehlermeldungen erhalten, entweder 'Warnung: HEAP [BMPSample.exe]: Warnung: ungültige Adresse angegeben RtlFreeHeap (00.940.000, 00941C80)' oder 'Warnung: HEAP [BMPSample.exe]: Warnung: Heap-Block um 00941C78 modifiziert um 00941C8C nach der angeforderten Größe von c' –

+0

Ein weiteres potentielles Problem ist die Indizierung in 'array [j] [i] [3]'. Abhängig davon, wie der 'Rgb'-Typ aussieht, sollten Sie vielleicht den Index 0, 1 und 2 anstelle von 1, 2 und 3 verwenden? –

+0

Ja, danke Bo. Ich habe das gerade erkannt und geändert und jetzt funktioniert es einwandfrei. Ich beschuldige, dass ich mich zu sehr an die Matlab-Indexierung gewöhnt habe. –

Verwandte Themen