2017-04-05 3 views
-1

So arbeite ich mit einer "Standard" -Bibliothek mit mehr als einem Jahrzehnt Geschichte für Gehirn Bild I/O. Ich bin auf diese Funktion gestoßen:Funktion einen Zeiger auf automatische Variable zurückgeben

nifti_image* nifti_image_read(const char *hname , int read_data){ 

    nifti_image* nim; 
... 

<<<some IO operations>>> 

... 

return nim; 
} 

Meine Frage ist, wie kommt es, dass diese Funktion einen lokalen Zeiger auf eine automatische Variable zurückgibt? Ist diese Praxis nicht verboten, da der Nim-Pointer den Gültigkeitsbereich verlässt und nach Beendigung der Funktion gelöscht werden soll?

Ich habe bereits this Frage konnte aber nicht meine Antwort bekommen:

+0

Es wird eine Kopie von Num nach Wert zurückgegeben. Vermutlich lädt die 'einige IO-Operationen' num mit der Adresse einiger Daten, deren Lebensdauer die von 'nifti_image_read()' übersteigen kann. Das ist in Ordnung, und dann gibt es auch seine Adresse zurück. – ThingyWotsit

+0

@ ThingyWotsit Ich habe einige Nachforschungen über die Rückgabe von Wert vs durch Referenz und bekam den Punkt jetzt. Vielen Dank. – Sourena

Antwort

0

Diese Funktion gibt den im Zeiger gespeicherten Wert zurück und ist in Ordnung. Der Zeigerwert ist die Adresse eines Objekts, das wahrscheinlich dynamisch zugewiesen wird und am Ende NICHT gelöscht wird, selbst wenn es C++ war. Das einzige mögliche Problem ist der Fall, in dem der Zeiger auf eine andere lokale Variable zeigt, die nicht dynamisch zugeordnet ist. Obwohl der Zeiger selbst den Gültigkeitsbereich verlässt, erhält der Aufrufer, der den Rückgabewert empfängt, eine Kopie der Adresse eines gültigen Objekts.

+0

Also ich denke, die gleiche Funktion, die aber durch Referenz wie folgt zurückgibt: nifti_image * & nifti_image_read() wäre falsch? – Sourena

+0

Referenzen mit der & Notation sind eine C++ Funktion, ich bin streng C Sie können sie nicht benutzen. Tatsache ist, dass der Zeiger nach der Funktion nicht mehr existiert, der Aufrufer jedoch seinen Wert in einer anderen Variablen erhält, was ausreichend ist. –

1

Es ist einfach, den Wert des nim Zeiger zurück.
Während der < < einige IO-Operationen >> Teil ich nehme an, dass Nim auf einige permanente Speicher im Heap oder global zeigen soll.

0

Sie geben keinen Zeiger auf eine lokale Variable zurück. Sie geben den Wert einer lokalen Variablen zurück, die zufällig ein Zeiger ist.

Angenommen, der Zeiger zeigt nicht auf eine andere lokale Variable selbst, dies ist eine sichere Operation.

Verwandte Themen