So geben Sie einen Zeiger als Funktionsparameter zurück

Lesezeit: 2 Minuten

Rookies Benutzeravatar
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.

Benutze das:

bool dosomething(char **data){
    int datasize = 100;
    *data = (char *)malloc(datasize);
    return 1;
}

char *data = NULL;
if(dosomething(&data)){
}

  • 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.

1452170cookie-checkSo geben Sie einen Zeiger als Funktionsparameter zurück

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy