Rückgabe lokaler Variablen...



  • Tach z'samme!

    Folgendes Problem:
    Habe in C eine Bibliothek für Matrixoperationen geschrieben, die ich für Aufgaben der Ausgleichungsrechnung benötige. Dafür habe ich mir folgende Struktur definiert:

    typedef struct
    {
    double **content;	     // Inhalt der Matrix -> dynamisch allokierbar
    int z;		     // Anzahl der Zeilen
    int s;		     // Anzahl der Spalten
    char comment[1000];    // Kommentar, Anmerkungen, what ever
    }
    MATRIX;
    

    Der Inhalt ist dynamisch, da erst zur Laufzeit des Progs feststeht, welche Dimension und welchen Inhalt die Matrix haben wird.

    Die Funktion zur Matrixinversion sieht folgendermaßen aus:

    MATRIX m_inv(MATRIX a)  // Funktion liefert invertierte Matrix zurück
    {
    //...	
    MATRIX erg;	// Ergebnismatrix
    //...	
    m_init(&erg,a.z,a.s,""); // Initialisierung von erg -> dynamische 
                             // Speicherzuweisung,... usw.
    //...
    return(erg);
    } // end function
    

    Nun folgendes: Praktisch funktioniert das so, aber theoretisch dürfte es nicht funktionieren:

    Die Zuweisung

    b = m_inv(a)
    

    im Hauptprogramm ruft die o.a. Funktion auf, in der eine lokale Variable namens erg initialisiert und mit den Ergebnissen gefüllt wird. Zurückgegeben wird by value... also werden die Werte von erg in die Variable b im Hauptprog. kopiert. Dies gilt auch für die Adresse in double **content von erg, die auf das lokale dynamisch allokierte zxs Array mit den Daten zeigt. Das Array selbst wird allerdings nicht kopiert und sollte daher nach Beendigung der Funktion aus dem Speicher entfernt werden, woraus folgt, dass der Zeiger double **content der Variablen b im Hauptprogramm die Adresse eines nicht mehr vorhandenen Datenarrays enthält, also eigentlich in die Pampa zeigen sollte... soweit die Theorie.
    In der Praxis funktioniert es allerdings... aber WARUM? 😞
    Ich habe die Befürchtung, dass irgendwann einmal irgendwas in meinem Speicher "passiert" und es dann auch praktisch nicht mehr funktioniert, ohne, dass ich das merke....

    Any suggestions?

    Greetings
    Hesindian



  • Das Array selbst wird allerdings nicht kopiert und sollte daher nach Beendigung der Funktion aus dem Speicher entfernt werden,

    Falsche Schlussfolgerung. Das Array wurde dynamisch angelegt und liegt daher auf dem Heap. Wenn du es wieder freigeben willst, mußt du free aufrufen. Nur Objekte auf dem Stack werden beim Verlassen der Funktion automatisch zerstört.



  • Dass ich das mit free wieder freigeben kann ist mir schon klar...

    Falsche Schlussfolgerung. Das Array wurde dynamisch angelegt und liegt daher auf dem Heap. Wenn du es wieder freigeben willst, mußt du free aufrufen. Nur Objekte auf dem Stack werden beim Verlassen der Funktion automatisch zerstört.

    ... heißt das also, dass der dynamisch zugewiesene Speicher, selbst wenn er in einer Funktion allokiert wurde, sicher und v.a. adressierbar im Speicher liegt? Sprich: muss ich mir da jetzt noch Gedanken machen, oder kann ich das so lassen?

    GreetZ
    Hesindian



  • Du kannst das so lassen.



  • Hab' Dank! 😃


Anmelden zum Antworten