in C: Warum wird eine Stapelstruktur existiert außerhalb der Funktion zugewiesen?

StackOverflow https://stackoverflow.com/questions/2352260

  •  23-09-2019
  •  | 
  •  

Frage

meine Funktion:

struct hostent * gethost(char * hostname){
    if(/*some condition under which I want 
         to change the mode of my program to not take a host*/){
       return null
    }
    else{
        struct hostent * host = gethostbyname(hostname);
        return host;
    }
}

in Haupt:

struct hostent * host = gethost(argv[2]);

(ignorieren Sie alle kleineren Fehler im Code, ich bin aus dem Gedächtnis spucke)

Dies funktioniert gut. und Valgrind sagt mir nicht, ich bin zu verlieren Speicher, trotz der Tatsache, ich bin nicht zu befreien.

Warum? Ich dachte an dem Stapel schwindet zugeordnet Sachen mit dem Funktionsaufruf zurückkehrt? oder ist es, weil ich den Zeiger zurückgeben? dies gefährlich in irgendeiner Weise?

War es hilfreich?

Lösung

host ist nicht auf dem Stapel reserviert, nur einen Zeiger auf es auf dem Stapel ist. Der Zeiger kopiert wird, wenn die Funktion zurückkehrt, so dass es nichts falsch mit dem Code.

Beachten Sie, dass gethostbyname nicht wirklich dynamisch Speicher zuweisen. Es gibt immer einen Zeiger auf den gleichen statisch zugewiesenen Speicherblock, weshalb valgrind kein Leck nicht melden. Seien Sie aber vorsichtig, weil das bedeutet, Sie hostent durch Ihre Funktion zurück kopieren, wenn Sie den Wert speichern für später, weil weitere Anrufe zu gethost es überschrieben werden soll.

Andere Tipps

Es ist in Ordnung und nicht Leck, weil der zurückgegebene Zeiger zeigt nicht auf Daten auf dem Stack oder Heap, aber einige statischen Variablen.

http://linux.die.net/man/3/gethostbyname :

  

Die Funktionen gethostbyname () und gethostbyaddr () zurückkehren Zeiger auf statische Daten, die durch spätere Anrufe werden überschrieben kann . Kopieren der Struktur hostent nicht ausreichen wird, da es Zeiger enthält; eine tiefe Kopie erforderlich ist.

aus dem Handbuch:

RETURN VALUE
       The gethostbyname() and gethostbyaddr() functions  return  the  hostent
       structure  or a NULL pointer if an error occurs.  On error, the h_errno
       variable holds an error number.  When non-NULL, the  return  value  may
       point at static data, ...

Einige Speicher an der Kompilierung reserviert ist (dh. In dem binären der Code) für die Struktur, die Funktion einen Zeiger auf diesen Speicher zurück.

Nun wird der Speicher nicht, bis alle Referenzen durchgesickert, um es verloren geht, in Ihrem Beispiel der Zeiger zurückgegeben wird, so gibt es immer noch einen Hinweis auf mich.

imho Allerdings ist es eine schlechte Design-Entscheidung auf den meisten Fällen auf einem anderen Teil des Codes verlassen dynamische Speicher freizugeben. Wenn die Funktion eine Struktur beispielsweise zurückgeben muss, sollte der Anrufer es tun und einen Zeiger auf die Struktur übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top