Rückgabe (Zeiger) aus Funktion
-
Nexus schrieb:
Das funktioniert nicht (oder ist undefiniertes Verhalten). Anders wäre es, wenn du mit
strcpy()
inptr
schreiben würdest. Aber so ist der Parameter sinnlos, da du ihm gleichbuffer
zuweist.Da die Zuweisung aber funktionslokal erfolgt, bleibt ptr im aufrufenden Kontext erhalten (uninitialisiert).
-
Wutz schrieb:
Da die Zuweisung aber funktionslokal erfolgt, bleibt ptr im aufrufenden Kontext erhalten (uninitialisiert).
Ja, und genau deshalb ist der Parameter bei seiner jetzigen Verwendung auch sinnlos. Oder was willst du damit sagen?
-
alles klar, danke für die schnellen Antworten.
Das Beispiel stammt aus "C von A bis Z": http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_006.htm#mj1d0c139ec6125f198a762880b480283f
Also ist die gezeigte Lösungsmöglichkeit falsch!?
-
Oh, wieder ein A-Z-Buch durchgefallen? Welch eine Überraschung.
-
Marcel__ schrieb:
char *test2(char *ptr){ char buffer[10]; ptr = buffer; strcpy(buffer, "testwert"); return ptr; } int main(void){ char *ptr; test2(ptr); printf("test2: %s\n", ptr); }
Bist du dir sicher, dass du richtig abgetippt hast?
Wenn ja, ist das Buch Schrott und probiere ein anderes.
Funktionieren sollte, wenn auch nicht thread-safe:char *test2(void){ static char buffer[10]; return strcpy(buffer, "testwert"); } int main(void){ printf("test2: %s\n", test2()); }
-
Das Buch ist bisher gut und ausführlich geschrieben.
Die anderen beiden Möglichkeiten, über static und den Speicher im Heap zu reservieren (malloc) werden ja auch vorgestellt.
-
Nexus schrieb:
Wutz schrieb:
Da die Zuweisung aber funktionslokal erfolgt, bleibt ptr im aufrufenden Kontext erhalten (uninitialisiert).
Ja, und genau deshalb ist der Parameter bei seiner jetzigen Verwendung auch sinnlos. Oder was willst du damit sagen?
Ich will damit sagen, dass bei Benutzung des Returnwertes der Variante
char *test2(char *ptr){ char buffer[10]; ptr = buffer; strcpy(buffer, "testwert"); return ptr; }
im aufrufenden Kontext
int main(void){ char *ptr; assert(test2(ptr)!=ptr); }
ist, der Returnwert auf den (ungültigen) Stack verweist, ptr jedoch nicht.
-
Marcel__ schrieb:
Das Buch ist bisher gut und ausführlich geschrieben.
Über die A-Z-Bücher und deren Autor habe ich bisher nur Schlechtes gehört...
Wutz schrieb:
Ich will damit sagen [...]
Das habe ich wie erwähnt verstanden, deshalb auch meine Anmerkung, dass der Parameter sinnlos sei. Wahrscheinlich besteht das Missverständnis darin, dass ich deine Antwort als Widerspruch aufgefasst habe.
-
Marcel__ schrieb:
alles klar, danke für die schnellen Antworten.
Das Beispiel stammt aus "C von A bis Z": http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_006.htm#mj1d0c139ec6125f198a762880b480283f
Also ist die gezeigte Lösungsmöglichkeit falsch!?
Ja, zumindest die 4.
Vielen Dank für den Link!
Habe selten so gelacht.
Da sind Antwortmasken, soll ich mal?
Nö, ich mache nicht die Arbeit von anderen offensichtlich professionellen Buchschreibern. Aber immerhin scheint dieses openbook ja kostenlos zu sein, da wollen wir mal nicht soviel rummäkeln.
-
Nexus schrieb:
Über die A-Z-Bücher und deren Autor habe ich bisher nur Schlechtes gehört...
Dann lies' sie mal, dann wird Dir richtig schlecht.
Das Zeug bringt einem richtig grottigen C-Style bei und die Beispiele sind ziemliches Bugland.
Weil sie aber einsteigerfreundlich geschrieben sind, tauchen hier immer wieder Newbies auf, die darauf beharren, daß das so gut sein muß, weil's in dem Buch so drinsteht.
Und der Forumsmeister Bäckmann propagiert den Schrott immer noch als klasse Einsteigerbuch.Gegen so viel Ignoranz ist man einfach machtlos ...
-
Ob die bücher gut sind sei dahingestellt, aber zumindest steht da wenn man genau ließt:
Doch Vorsicht, Folgendes funktioniert nicht:
char *eingabe(char *str) { char input[MAX]; printf("Bitte \"%s\" eingeben: ", str); fgets(input, MAX, stdin); return input; }
damit deren beispiel geht, benutzen die strtok, da dass intern die eigenen token speichert und diese daher noch nach dem funktionsaufruf gültig sind, aber wer sich sowas ausdenkt gehört erschossen.
char *eingabe(char *str) { char input[MAX]; printf("Bitte \"%s\" eingeben: ",str); fgets(input, MAX, stdin); return strtok(input, "\n"); }