dynamisches char*** Array
-
Ich möchte in C ein mehrdimensionales dynamisches String Array, eine String Matrix, erzeugen und wieder freigeben. Also, ich möchte Strings via strcpy (strArray[2][5], "testString"); speichern können. Das Erzeugen und das Arbeiten mit dem Array funktioniert soweit, bin mir aber nicht sicher ob das alles so 100%'tig ist
Beim Freigeben des Speicherplates hakt es jedenfalls.
Hier der Code :
char ***createStringArray() { int i, j; char ***stringArray; stringArray = (char***) malloc (sizeof (char*) *5); // 5 Zeilen ? for (i=0; i<10; i++) stringArray[i]=(char**) malloc(sizeof(char*)*10); // 10 Spalten ? for (i=0; i<5; i++) for (j=0; j<10; j++) stringArray[i][j]=(char*) malloc(sizeof(char*)*10); // 10 Zeichen pro Feld return stringArray; } int main () { int i, j; char ***strArray; strArray = createStringArray(); // einfach mal was zuweisen : for (i=0; i<3; i++) strcpy (strArray[2][i], "testString"); // und ausgeben : for (i=0; i<3; i++) printf("%s\n", strArray[2][i]); //freigeben : for (i=0; i<5; i++) for (j=0; j<10; j++) free (strArray[i][j]); // freigeben erzeugt Fehler for (i=0; i<10; i++) free (strArray[i]); // freigeben erzeugt Fehler free (strArray); return 0; }
Wie an den Kommentaren zu sehen, verursachen die letzen beiden free()-Aufrufe Fehlermeldung.
Das erste free() : *** glibc detected *** double free or corruption (out): 0x0804a020 ***
Das zweite free() : *** glibc detected *** free(): invalid next size (fast): 0x0804a008 ***
Mit zweidimensionalen char-Array klappt bei mir alles, aber bei 3d-char Arrays *hmpf*
Hoffe, mir ist zu helfen
-
Das einzige was mir gerade auffällt ist, dass du mit strcpy() 11 Bytes an eine Stelle kopierst für die du nur 10 Bytes reserviert hast.
Ansonsten:
- malloc muss/sollte nicht gecastet werden
- sizeof(char) ist immer 1
- hierstringArray = (char***) malloc (sizeof (char*) *5); // 5 Zeilen ?
wäre es formal gesehen korrekter sizeof(char*)* zu schreiben. Oder wie ich es idR mache: *sizeof(stringArray).
-
Hallo !
Im Prinzip brauchst du:
anzahl_zeilen * sizeof ( char*** )
anzahl_spalten * sizeof ( char** )Dann in einer Doppel-For-Schleife, so wie du es im grunde schon hast:
arr[i][j] = malloc( len * sizeof ( char ) ); // prinzipiell
Dann sollte das funzen.
Wenn nicht, kann ich dir immer noch meine Lösung komplett posten.Gruß,
p.
-
proggingmanias return schrieb:
Dann sollte das funzen.
100%
-
Hab den Fehler gefunden
Die 1. For-Schleife in createStringArray() muss von 0 bis 5 laufen (durch die Zeilen eben) um dann Platz für die 10 Spalten zu schaffen.
Tim & proggingmanias : Vielen Dank für die Tips