Pointer als rueckgabe wert von funktionen



  • hi,

    ich bin C coder und lese hier grad nen tutorial zu C++ und da habe ich gerade was gelesen das mich doch recht naja ueberrascht / verunsichert hat ...

    Betrachten wir folgendes Programm:

    #include <iostream>
        using namespace std;
    
        int* foo(int value)
        {
          int arr[2];
          arr[0]=value;
          arr[1]=-value;
          return arr;
        }
    
        int main()
        {
          int* p=foo(7);
          cout<<p[0]<<'\n'<<p[1]<<'\n';
        }
    

    Was wird ausgegeben? Garnichts, denn wir haben hier undefiniertes verhalten. arr ist eine lokale Variable innerhalb von foo. Wir wissen, dass lokale Variablen beim Beenden der Funktion aufhören zu existieren. Somit hört auch arr auf zu existieren und p zeigt auf die Stelle, an der arr einmal war. Dies bedeutet: undefiniertes Verhalten, denn arr[0] und arr[1] existieren ja nicht mehr.

    ich muss sagen das ich solche sachen in C doch relativ oft mache und es gab bis jetzt keine probleme damit, nu bin ich wie oben geschrieben leicht verunsichert.
    was macht ihr in solchen faellen? oder ist es garnicht so schlimm wie hier dargestellt? (wie gesagt gab bei mir noch nie probleme).

    wenn mich nicht alles taeuscht wurde das sogar in meinem C lehrbuch so gemacht (keine garantie), aber zumindest wurde dort sicher nicht auf eine solche problematik hingewiesen.



  • @TDO, bei soetwas übergibt man normalerweise die zu verarbeitenden Daten:

    int* foo(int value, int arr[2] )
    {
      ...
      return arr;
    };
    
    int main()
    {
      int arr[2] = { 1, 2 };
      int* p = foo( 7, arr );
      ...
    }
    


  • Was du da siehst ist ein lupenreiner Fehler. In C ebenso wie in C++, heute wie
    auch schon vor zwanzig Jahren. Wenn du Keine Probleme hast, dann hast du es
    wahrscheinlich nicht genau so gemacht, siehe Herrmann.
    Andernfalls hättest du mehr Glück als Verstand. Und das kann sich bekanntermassen
    jede Sekunde ändern. 😉



  • TDO schrieb:

    oder ist es garnicht so schlimm wie hier dargestellt?

    Doch, ist es. Undefiniertes Verhalten bedeutet letztendlich, dass alles passieren kann (sogar, dass es so wie gewünscht funktioniert). Garantien gibt es aber keine und Programmieren sollte alles andere als Glücksspiel sein.

    TDO schrieb:

    wenn mich nicht alles taeuscht wurde das sogar in meinem C lehrbuch so gemacht

    Da täuschst du dich wahrscheinlich. Vermutlich wird dort der Wert einer lokalen Variablen zurückgegeben, was ja absolut legitim ist. Oder es war eine Variable mit static Lebensdauer. Ansonsten ist das Lehrbuch diesbzgl. Müll.


Anmelden zum Antworten