pointer auf lokale Variable als Rückgabewert
-
Hallo,
ich habe schon den ähnlich lautenen thread hier gelesen und hätte dazu ein paar Fragen.
void foo1(void) { return "blabla"; } char* foo2(void) { static char* buffer = "blabla"; return buffer; } void foo3(char* buffer) { strcpy(buffer,"A Gu Gu"); }
Das Problem lösen sollten alle 3 Funktionen, allerdings wird bei den ersten beiden Funktionen ein Zeiger auf eine eigentlich nur lokal sichtbare Variable zurückgegeben, womit diese dann anschließend im aufrufenden Block auch sichtbar ist?
Zumindest foo2()habe ich schon öfter gesehen, ist das korrekt?
Am saubersten finde ich foo3() aus einem älteren Beitrag hier im Forum, aber dort muß vorher der Speicher bereitgestellt werden, was bei den anderen Versionen nicht nötig ist.
Was ist Eurer Meinung nach der beste Weg?
Gruß hannes
-
hmm..
meiner Meinung nach 3.
Okay, Du musst zwar den Speicher ausßerhalb extra bereitstellen, aber in im 2. kann's dir dafür passieren, dass der Speicher geändert wird, obwohl du ihn außerhalb noch brauchst. (du hast quasi nur eine Variable in die du auch nur einen Wert schreiben kannst.
foo3 bekommt den Pointer und kann somit einzelne Variablen belegen.
bin mir nich ganz sicher, aber sollte hinter dem void von foo1() nicht ein * stehen??
-
foo2:
da kannst du Probleme mit der Threadsicherheit bekommen (und auch ohne Threads hat man da leicht probleme), zB. hat strtok so ein Problem.foo3:
du solltest die Funktion aus Sicherheitsgründen so schreibenvoid foo3(char *s, size_t n) { strncpy(s,"string",n); s[n]=0; }
um potenzielle Bufferoverflows zu vermeiden!
-
danke für eure antworten!
foo1() gibt natürlich auch char* zurück.