2017-08-24 5 views
0

Dies ist wahrscheinlich eine Frage, aber ich weiß nicht einmal, wofür man googeln soll.Struct wird auf Null gesetzt, wenn die Funktion abläuft?

Ich versuche, eine Sicherung Dateisystem zu implementieren und zu Schwierigkeiten beim structs habe, stammt wahrscheinlich von mir mit C++ unerfahren zu sein.

static int getStat(std::string path, struct stat *stout) 
{ 
    ... 
    struct stat *st = new struct stat(); 
    lstat(path.c_str(), st); 
    // lstat correctly filled st according to gdb 
    ... 
    stout = st; 
    // values are correctly copied to stout according to gdb 
} 

void something() 
{ 
    struct stat *st = new struct stat(); // this might also be stack allocated by fuse, idk 
    getStat("/", st); 
    // but st is all zero now !? 
} 

Was fehlt mir? Wie bekomme ich meine Daten korrekt aus der Funktion?

+0

Nicht sicher, ob Sie es weggelassen haben oder nicht, aber beachten Sie, dass 'getStat' einen Wert zurückgeben muss, sonst haben Sie UB. – NathanOliver

+0

Und es gibt auch ein mögliches Speicherleck, wenn Sie die Struktur nicht löschen, bevor Sie "stout" zuweisen und neu zuweisen. –

+0

Geben Sie keine Statistik auf dem Heap (nicht neu)! Ordnen Sie auf dem Stapel zu und übergeben Sie die Adresse an lstat. –

Antwort

3

Sie haben einen doppelten Zeiger passieren zu können geänderte Zeiger in CLIP-Funktion reflektieren.

So dies die Lösung

static int getStat(std::string path, struct stat **stout) 
... 
getStat("/", &st); 

In ist, Funktionsargumente werden immer durch Wert übergeben (mit Ausnahme von Referenzen). Dies bedeutet, dass in der Funktion getStat(), stout eine Kopie des Zeigers auf die Struktur steht, die im Funktionsaufruf übergeben wurde.

Also, wenn die neue Adresse stout innerhalb der Funktion zugewiesen ist, dies keine Auswirkung auf den ursprünglichen Zeiger hat in something() auf struct (seit stout innerhalb getStat() ist nur eine Kopie von st innerhalb main()).

Da wir in sind Sie in der Lage Referenz zu verwenden, wie @SomeProgrammerDude vorgeschlagen.

static int getStat(std::string path, struct stat& stout) 
struct stat st; 
getStat("/", st); 
+1

Warum "Doppelzeiger" beim Programmieren in C++ verwenden? C++ hat Pass-by-Reference. –

+0

Es ist nur die Erklärung des Problems. –

+0

Beachten Sie, dass die Frage markiert ** C++ ** nicht C. In C++ müssen Sie nicht Pass-by-reference emulieren, wie Sie in C benötigen, da C++ nativen Referenzen haben. –

Verwandte Themen