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
?
Ja! Ja !! Der Zeiger bleibt der Zeiger. Sogar das "* p" ist null. Vielen Dank! – user1418404
'* 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. –