2016-06-22 154 views
1

我正在通過關注Beej's Guide to Network Programming文章學習網絡編程。有一個例子:在freeaddrinfo上發生了什麼事?

bind()
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); 
} 

後,freeaddrinfo()被調用。我認爲servinfo鏈接列表現在應爲NULL,並且指針p應該爲NULL,但不是,p不是NULL,代碼運行良好。

我想知道爲什麼在調用freeaddrinfo之後p不爲空?

回答

2

在循環之後該指針p要麼指向用於成功地創建和綁定套接字,或者這將是NULL如果可以使用沒有結構的addrinfo結構。

這個freeaddrinfo在循環和檢查之間被調用並不重要,因爲你不取消引用變量p,你只檢查它是否是空指針。

但是,如果在調用freeaddrinfo後試圖取消引用p那麼你會嘗試訪問存儲不再分配給你,你將有未定義行爲

freeaddrinfo調用不會更改任何變量,它不能。如果分配的指針爲malloc,然後用該變量調用free,則它不會將變量設置爲NULL,也不會將指向同一內存的任何其他變量設置爲NULL。閱讀有關的更多信息,按值傳遞參數以模擬c中的引用,以瞭解有關原因的更多信息。

+0

是的!是的!指針仍然是指針。即使'* p'也是空的。謝謝! – user1418404

+0

調用'freeaddrinfo()'後''p'不保證爲NULL。如果'* p'變爲NULL',那麼分配內存管理器的副作用就是釋放'serveinfo'。有些內存管理器在釋放內存時會將內存清零(或者甚至用特殊的值如0xcdcdcdcd或0xbaadfood來幫助調試),但是不能依賴代碼中的行爲。 –

0

這與使用free時發生的情況沒有什麼不同 - 指針仍指向相同的地址,但實際內存未分配。這不是一個簡單的免費電話的原因是,你實際上已經釋放了一系列資源。從手冊:

freeaddrinfo()函數釋放分配給 動態分配的鏈表res的內存。