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
    - hier

    stringArray = (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 😉


Anmelden zum Antworten