Zeiger auf Zeiger für dynamischen Speicher
-
Hallo,
ich habe mir ein Programm geschrieben, dass eine als Text gespeicherte Excel-Tabelle in Latex-Source umwandelt und speichert.
In der ersten Variante habe ich die einzelnen Zellen eingelesen und direkt in Outputfile geschrieben. Gestern kam mit dir Idee die Tabelle erst komplett einzulesen und dann erst das Outputfile zu erstellen und dafür brauchte ich dynamischen Speicher.
Jetzt meine Frage: Geht das so?char *(*table); table = (char**)malloc(zellen*sizeof(*table)); // zellen: Anz. Zellen for (j=0; j<zellen; j++) table[j] = (char*)malloc(N*sizeof(char)); // N: Anz. Zeichen pro Zelle
Also im Debugmodus sieht das gut aus, aber macht man das auch so mit dem anfordern von Speicher?
Gruß Senfy
-
Die Klammern bei der Definition und die casts bei malloc kannst du weglassen.
sizeof(char)
ist per Definition 1. Brauchst du also auch nicht.
Wenn dann schreibsizeof(**table)
Und immer den Rückgabewert von malloc überprüfen und entsprechend reagieren.
-
Ok, danke erstmal.
Die Klammer beim Vereinbaren lasse ich jetzt weg.
Die Casts lasse ich drin, weil malloc void* als Rückgabe hat. (Ja, ich weiß das muss nicht sein, aber es stört mein Empfinden.)Warum sollte ich sizeof(**table) nehmen? Der Befehl liefert doch die Größe eines char Zeigers zurück, oder? Und ich brauche doch die Größe eines char (Auch wenn das in diesem Fall das gleiche ist).
Noch eine kurze Frage:
So gebe ich den Speicher zur Zeit wieder frei:for (j=0; j<zellen; j++) free(table[j]); free(table);
Würde es auch reichen, wenn ich nur free(table) schreibe?
Gruß Senfy
-
Senfy schrieb:
Warum sollte ich sizeof(**table) nehmen? Der Befehl liefert doch die Größe eines char Zeigers zurück, oder? Und ich brauche doch die Größe eines char (Auch wenn das in diesem Fall das gleiche ist).
Weil du die Größe von **table wissen willst. Und wenn du weißt das es ein char ist, kannst du das auch gleich weg lassen. (weil sizeof(cher) = 1. immer)
An den Haaren herbeigezogen: Wenn du mal die Definition von table änderst, hast du eine Fehlerquelle weniger.Senfy schrieb:
Würde es auch reichen, wenn ich nur free(table) schreibe?
Nein!
Denn jeder mit malloc angeforderte Speicher wird vom System auch getrennt verwaltet. free weiß ja nicht wie die Zeiger miteinander verbunden sind.
-
Ok, danke für die Hilfe!
Ich finde es übrigens super, das man schnell ohne Registrierung posten kann.