2D-Array dynamisch zur Laufzeit erweitern
-
Hallo,
ich habe gerade Probleme bei einem Programm in dem es darum geht eine Art Stringtabelle (array) so dynamisch wie möglich umzusetzen. D.h. ich lese zeichenweise vom stdin, kopiere jedes Zeichen in einen Bufferbereich bis der voll ist oder \n auftaucht.
Hierzu mal die ersten Zeilen Quelltext:
/* Ausgangsform der Tabelle herstellen...*/ if( ( array = malloc( sizeof( *array ) ) ) == NULL ) { fprintf( stderr, "Fehler bei Speicherreservierung!\n" ); return EXIT_FAILURE; } /* ... (einlesen und in Puffer kopieren bis \n) ... */ if( c == '\n' ) { if( line > 0 ) { /* eine Reihe anhaengen */ if( ( array = realloc( array, sizeof( *array ) ) ) == NULL ) { fprintf( stderr, "Konnte keinen Speicher fuer weitere Elemente anfordern!\n" ); } } /* Zeichenkette ans Ende anhaengen */ if( ( array = appendString( array, line - 1, tmp, n ) ) == NULL ) { fprintf( stderr, "Fehler beim Anhaengen der Zeichenkette!\n" ); } }
Die Funktion appendString sieht folgermaßen aus:
char** appendString( char** dest, int nr, const char* s, size_t len ) { if( dest != NULL ) { if( ( dest[nr] = malloc( len + 1 ) ) == NULL ) return NULL; else { /* in Speicherbereich kopieren... */ } } else return NULL; return dest; }
Hier ist aber irgendwo der Hund begraben, da nach 4 Zeilen das Programm abbricht mit dem netten Hinweis: realloc(): invalid next size: 0x08f6d008
Dass es ausgerechnet 4 Zeilen sind kommt wohl daher, dass ein Pointer auf meinem System 4 Byte belegt, oder?Ich komme nur gerade nicht dahinter wieso dieses Konstrukt nicht so funktioniert wie es soll: ein 2D-Array anlegen, und nach jedem \n eine neue Reihe an das Array anfügen und die Zeichenkette reinkopieren.
Hat jemand von euch einen Hinweis? Vielen Dank im Voraus
-
Vielleicht hätte ich erstmal schlafen gehen sollen. Das Problem ist gelöst.
Dabei lag der (Logik-)Fehler in folgender Zeile:
if( ( array = realloc( array, sizeof( *array ) ) ) == NULL ) { fprintf( stderr, "Konnte keinen Speicher fuer weitere Elemente anfordern!\n" ); }
Der Speicherbereich wird hier ja quasi nicht erweitert - zumindest bleibt die Größe immer die gleiche. Die korregte(re) Form wäre gewesen:
if( ( array = realloc( array, (line + 1) * sizeof( *array ) ) ) == NULL ) {