Forum: Compiler & IDEs Call by und return Wert


von Marvin (Gast)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von Marvin (Gast)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

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
Noch kein Account? Hier anmelden.