2016-06-22 4 views
1

Ich lerne Netzwerkprogrammierung, indem ich den Beej's Guide to Network Programming Artikel befolge. Es gibt ein Beispiel:Was passierte auf freeaddrinfo genannt?

struct addrinfo hints, *servinfo, *p; 

if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    return 1; 
} 

// loop through all the results and bind to the first we can 
for(p = servinfo; p != NULL; p = p->ai_next) { 
    //socket(...) 
    //bind(...) 
    break; 
} 

freeaddrinfo(servinfo); // all done with this structure 

if (p == NULL) { 
    fprintf(stderr, "server: failed to bind\n"); 
    exit(1); 
} 

Nach bind(), freeaddrinfo() genannt wird. Ich denke, die servinfo Linkliste jetzt NULL sein sollte, und auch der Zeiger p sollte NULL sein, aber nein, p nicht NULL ist und der Code funktioniert gut.

Ich möchte wissen, warum ist nicht null nach dem Aufruf freeaddrinfo?

Antwort

2

Nach der Schleife der Zeiger p entweder zeigt auf die addrinfo Struktur, die erfolgreich verwendet wurde, zu erzeugen und die Buchse zu binden, oder es wird NULL wenn keine der Strukturen verwendet werden könnten.

Dass die zwischen der Schleife und der Prüfung aufgerufen wurde, spielt keine Rolle, weil Sie die Variable p nicht dereferenzieren, Sie überprüfen nur, ob es ein Nullzeiger ist oder nicht.

Wenn Sie jedoch zu dereferenzieren versuchen p nach dem Aufruf freeaddrinfo dann würden Sie versuchen, Speicher nicht mehr zu Ihnen zugewiesen zugreifen zu können, und Sie werden undefiniertes Verhalten haben.

Der freeaddrinfo Aufruf ändert sich nicht alle Ihre Variablen, kann es nicht. Wenn Sie einen Zeiger mit malloc zugeordnet haben und dann rufen Sie free mit diesen Variablen, nicht festgelegt es nicht um die Variable NULL, noch konnte eingestellt es andere Variable zeigt auf den gleichen Speicher zu NULL. Lesen Sie mehr über Gang Argument von Wert und Pass in c durch Bezugnahme emuliert erfahren Sie mehr darüber, warum.

+0

Ja! Ja !! Der Zeiger bleibt der Zeiger. Sogar das "* p" ist null. Vielen Dank! – user1418404

+0

'* p 'ist nicht garantiert, dass NULL ist, nachdem' freeaddrinfo() 'aufgerufen wurde. Wenn '* p 'NULL bekommt, dann ist das ein Nebeneffekt des Speichermanagers, der' serveinfo' zugewiesen hat und freigibt. Einige Speicher-Manager * löschen Speicher, wenn sie ihn freigeben (oder füllen ihn sogar mit speziellen Werten wie '0xcdcdcd' oder' 0xbaadfood', um das Debuggen zu unterstützen), aber Sie können sich nicht auf dieses Verhalten in Ihrem Code verlassen. –

0

Es ist nicht anders als das, was passiert, wenn Sie frei verwenden - der Zeiger noch auf die gleiche Adresse verweist noch der tatsächliche Speicher nicht zugeordnet ist. Der Grund dafür, dass es sich nicht um einen einfachen kostenlosen Anruf handelt, ist, dass Sie tatsächlich eine Ressourcenliste freigeben. Aus dem Handbuch:

Die freeaddrinfo() Funktion gibt den Speicher, der für die dynamisch zugewiesenen verknüpften Liste res zugeordnet wurde.