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.
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? –
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
@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. –