Hallo nochmal!
brauch ich nicht einen char*** um den Parameter zu manipulieren?
uffffff ...
Ich habe mir das Konzept nochmal genau durch den Kopf gehen lassen. Ja, im Prinzip hast du Recht. Denn du gibst einen uninitialisierten char** in die Funktion hinein, die tut irgendwas damit, aber davon bekommt die übergeordnete Funktion nix mit. Wow.
Ich habe solche Algorithmen bisher immer so gelöst, dass die aufrufende Funktion (caller) die Speicherreservierung vornimmt und der aufgerufenen Funktion (callee) dann einen Zeiger auf diesen reservierten Speicherbereich übergibt. Das ist einfacher zu überblicken und zu debuggen, und man kann die Funktion dann sowohl mit statisch als auch dynamisch reservierten Puffern verwenden. Nachteil: Der Speicherbedarf muss vorher bekannt sein (oder eine definierte Begrenzung haben), oder man muss Strukturen nutzen, die von sich aus eine dynamische Größe haben, etwa verkettete Listen. Einfacher ist das aber auch nicht.
Auf dein Beispiel übertragen könnte man das Dilemma aber umgehen, indem man die Semantik ändert. Ich würde
int function(char *, char **)
ändern in
char **function(char *, int *)
und dann den Zeiger auf den Speicherbereich, den die Funktion reserviert hat, als Funktionsergebnis zurückgeben (im Fehlerfall NULL), die Anzahl der Teilstrings dann über den int-Zeiger[*].
[viel Code]
ich habe mir jetzt nicht die Mühe gemacht, den Code im Einzelnen zu sichten, denn ich habe den Eindruck, du hast das Problem an sich erkannt. Aber bevor du da von Hölzchen auf Stöckchen kommst: Vielleicht geht's mit einem etwas anderen Ansatz einfacher.
//free allocated space
printf("free:\n");
free(mystrings);
Damit gibst du allerdings nur die Zeiger auf die Strings frei, nicht die Strings selbst.
So long,
Martin
[*] Wenn man es richtig machen will, prüft man innerhalb der Funktion noch, ob der int* gültig (nicht null) ist, und schreibt den Rückgabewert nur in diesem Fall. Not a bug, but a feature: Wenn die caller-Funktion die Anzahl nicht braucht, übergibt sie einfach NULL anstelle eines int*.
Paradox ist, wenn jemand eingefleischter Vegetarier ist.