So geben Sie einen Zeiger als Funktionsparameter zurück
Lesezeit: 2 Minuten
Anfänger
Ich versuche, den Datenzeiger vom Funktionsparameter zurückzugeben:
bool dosomething(char *data){
int datasize = 100;
data = (char *)malloc(datasize);
// here data address = 10968998
return 1;
}
aber wenn ich die Funktion folgendermaßen aufrufe, ändert sich die Datenadresse auf Null:
char *data = NULL;
if(dosomething(data)){
// here data address = 0 ! (should be 10968998)
}
Was mache ich falsch?
Verwenden Sie wirklich C oder verwenden Sie C++ (einige Kommentare deuten darauf hin, dass Sie über C++-Referenzen sprechen).
– Johannes Schaub – litb
13. März 2011 um 0:16
Ich habe es nicht als C++ markiert, weil ich nicht wusste, dass es wichtig ist, und die Leute beschweren sich oft: „Das ist nicht C++, das ist C“, weil ich malloc() verwende …
– Neuling
13. März 2011 um 0:18
Sie gehen am Wert vorbei. dosomething ändert seine lokale Kopie von data – Das wird der Anrufer nie sehen.
Oh verdammt … ich verstehe, ein Zeiger auf den Zeiger … aber gab es nicht eine andere Möglichkeit, das zu tun? Ich habe Funktionen gesehen, die einen Zeiger ohne & darin akzeptieren. Ist es möglich, meine Funktionsfunktion auf diese Weise zu konvertieren? (Ich mag es ohne und da es weniger fehleranfällig ist)
– Neuling
13. März 2011 um 0:04
Du könntest es tun char * dosomething(char *) und den neuen Zeiger zurückgeben.
– Erik
13. März 2011 um 0:06
aber ich möchte den bool-Wert von der Funktion zurückgeben, ich meinte, wenn ich die Funktion aufrufen könnte dosomething(data) anstatt dosomething(&data) Trotzdem? vielleicht in c++?
– Neuling
13. März 2011 um 0:09
in C++ ja – dann verwenden bool dosomething (char * & data) – als Referenz übergeben
– Erik
13. März 2011 um 0:10
Ist der Anrufer in diesem Fall dafür verantwortlich, die Zuordnung des Zeigers aufzuheben? (Daten löschen oder ähnliches)?
– BadPirate
1. November 2011 um 5:14
int changeme(int foobar) {
foobar = 42;
return 0;
}
int main(void) {
int quux = 0;
changeme(quux);
/* what do you expect `quux` to have now? */
}
Mit deinem Snippet ist es das Gleiche.
C geht vorbei alles nach Wert.
14521700cookie-checkSo geben Sie einen Zeiger als Funktionsparameter zurückyes
Verwenden Sie wirklich C oder verwenden Sie C++ (einige Kommentare deuten darauf hin, dass Sie über C++-Referenzen sprechen).
– Johannes Schaub – litb
13. März 2011 um 0:16
Ich habe es nicht als C++ markiert, weil ich nicht wusste, dass es wichtig ist, und die Leute beschweren sich oft: „Das ist nicht C++, das ist C“, weil ich malloc() verwende …
– Neuling
13. März 2011 um 0:18