Call by und return Wert

Gast #3572677
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
#3572685
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren