Hi Folks, Auf der Seite http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_006.htm verstehe ich das letzte Beispiel nicht: /* Möglichkeit3: Einen Zeiger als Argument übergeben */ char *test4(char *ptr){ char buffer[10]; ptr = buffer; strcpy(buffer, "testwert"); return ptr; } Vorher wurde geschrieben: /* Fehler: Funktion gibt die Adresse * einer lokalen Variablen zurück. */ char *test1(void){ char buffer[10]; strcpy(buffer, "testwert"); return buffer; } Müsste buffer bei Möglichkeit 3 nicht auch auf dem Stack liegen (lokale Variable) und daher falsch sein ? Andersrum buffer = ptr hätte ich es verstanden, wenn ptr mit char ptr[10] initialisiert wurde. Wobei buffer dann ja nur noch char * buffer sein müsste. Was macht der Compiler da ? Legt er den buffer auf den Stack und eine Zeile später ptr = buffer erkennt er, dass das eher wie static behandelt werden will ? Die anderen Beispiele mit static (das ist ja keine lokale Variable auf dem Stack mehr, nur die Sichtbarkeit ist eingeschränkt) und malloc sind klar. Gruß Marvin
buffer liegt auf dem Stack und wird beim verlassen der Funktion auch wieder zerstört. Der Rückgabewert (der Zeiger auf buffer) ist somit nicht mehr gültig. Dieses (Online-)Buch hat noch mehr Fehler. Ohne buffer wirds richtig.
1 | char *test4(char *ptr){ |
2 | strcpy(ptr, "testwert"); |
3 | return ptr; |
4 | }
|
Dies ist allerdings unsicher, da die Größe/Länge von dem Speicher hinter ptr zu klein sein kann.
Gut aufgepasst. Möglichkeit 3 enthält genau den selben Fehler wie die andere Version. Richtig wäre es, den buffer ausserhalb der Funktion anzulegen und per pointer zu übergeben. Oliver
Hi, Danke Euch. Dachte ich versteh C nicht oder vielleicht was neues in C11 :) Wenn da noch mehr solche Patzer sind...dann ist das Buch aber nix für Neulinge. Bye Marvin
Marvin schrieb: > Wenn da noch mehr solche Patzer sind... Dann lies dir doch mal bei Amazon die Kundenrezensionen zu den schlechten Bewertungen für das Buch durch. Die gedruckte Ausgabe wurde wohl schon verbessert, aber gerade die Online-Ausgabe ist noch die erste Auflage.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.