char* als Rückgabewert einer Funktion
-
Minimee schrieb:
Oder so (wenn auch unschön
):
Fishmac schrieb:
... main(...){ char * result; result=function(); printf("%s\n",result); } char* function(void){ static char* tmp = "Nix"; ... return tmp; }
was bezweckst du mit dem 'static'?
möchtest du rechenzeit sparen, weil der pointer 'tmp' bereits vor eintritt in die funktion initialisiert wird?
auf das "Nix" hat es jedenfalls keinen einfluss...
-
pale dog schrieb:
doch, geht, probier's aus.
du brauchst kein 'malloc', der string ist 'fest' und bleibt erhalten...
Wie war das mit dem Stack und dem Verlassen einer Funktion ?
Ich dachte immer, dann wird der Stack wieder abgeräumt, beim Verlassen der Funktion.
-
proggingmania schrieb:
Wie war das mit dem Stack und dem Verlassen einer Funktion ?
Ich dachte immer, dann wird der Stack wieder abgeräumt, beim Verlassen der Funktion.stimmt ja auch, aber..
1. der inhalt der stackvariablen wird ja zurückgegeben, d.h. zum aufrufer kopiert, danach kann die variable gelöscht werden, das macht nichts.
2. der string "Nix" wird nicht auf dem stack angelegt, sondern ist konstant und während der gesamten laufzeit vorhanden.
-
Das ist purer Zufall, das dein String noch lebt, weil der Speicher ungenutzt ist.
Der könnte im weiteren Programmverlauf wieder überschrieben werden.
-
proggingmania schrieb:
Das ist purer Zufall, das dein String noch lebt, weil der Speicher ungenutzt ist.
Der könnte im weiteren Programmverlauf wieder überschrieben werden.nein, schau mal
#include <stdio.h> char *hello (void) { return "Hello, World!"; // der string ist konstant, er wird nicht auf dem stack abgelegt, es wird die adresse des strings zurückgegeben. } int main() { printf (hello()); // geht, kein problem ;) }
-
pale dog schrieb:
1. der inhalt der stackvariablen wird ja zurückgegeben, d.h. zum aufrufer kopiert, danach kann die variable gelöscht werden, das macht nichts.
2. der string "Nix" wird nicht auf dem stack angelegt, sondern ist konstant und während der gesamten laufzeit vorhanden.Achsooooo !!!
Wieder etwas dazugelernt !!!
Danke !!!
-
Hi !
Hab in ein C-Buch reingeguckt, die Zeiger müssen als static angelegt
werden. Ansonsten ist der Rückgabewert undefiniert.Gruß,
p. ( logged off )
-
Der im C Buch liest. schrieb:
Hab in ein C-Buch reingeguckt, die Zeiger müssen als static angelegt
werden. Ansonsten ist der Rückgabewert undefiniert.Ne ne ne, lies das was pale dog gesagt hat. Entweder erzählt dein C-Buch Blödsinn oder du hast die Situation verwechselt.
int *FALSCH0() { int i = 10; // i liegt auf dem Stack return &i; // Fehler: Zeiger auf eine lokale Variable zurück gegeben } // i existiert nicht mehr, der Zeiger ist ungültig char *kein_problem() { char *foo = "ba"; return foo; } // foo existiert zwar nicht mehr, aber das worauf es gezeigt hat char **FALSCH1() { char *foo ="bar"; char **bar = &foo; // Zeiger auf foo, was auf dem Stack liegt return bar; } // bar, foo existieren nicht mehr. Zeiger ist ungültig
-
krass
-
Dersichim C Buch verliest schrieb:
krass
nochmal zusammengefasst: eine funktion darf nicht die adresse eines ihrer lokalen objekte zurückliefern. das geht schief. andere adressen (heap, static, BSS, irgendwas berechnetes, etc.) aber schon.
-
-
Danke an alle.
Also mit der Version
main(){ char* nix; nix=foo(char **nix); } char* foo(char **nix){ char* tmp=nix; tmp="String"; return tmp; }
in etwa (habs nicht mehr genau im Kopf)gehts.......
Danke an alle !
-
Völlug falsch,
1. es sollte nix=foo(char &nix); heißen
2. foo macht irgendwie keinen Sinn, da kannst du gleich
char *foo(char **nix) { return "String"; }
schreiben.
-
supertux schrieb:
char *foo(char **nix) { return "String"; }
Das gleiche in Grün:
char *foo( void ) { return "String"; }
-
Warum nicht gleich char* nix = "string"; ? ^^
-
Eben.
-
einfachheit ftw schrieb:
Warum nicht gleich char* nix = "string"; ? ^^
bei diesem Beispiel schon, ich wollte aber verdeutlichen, dass die Funktion im Beispiel, so wie sie ist, falsch ist, weil ....