2015-10-01 55 views
0

什麼我不明白的是**res雙指針,在手冊頁它指出:解釋的getaddrinfo的參數()

的提示參數指向一個addrinfo中的結構,用於指定選擇插座 標準在res指向的 列表中返回的地址結構。

我看到*hints是一個指向addrinfo結構,但**res如何返回套接字地址結構?

Specification

int getaddrinfo(const char *node, const char *service, 
       const struct addrinfo *hints, 
       struct addrinfo **res); 


struct addrinfo { 
    int    ai_flags; 
    int    ai_family; 
    int    ai_socktype; 
    int    ai_protocol; 
    socklen_t  ai_addrlen; 
    struct sockaddr *ai_addr; 
    char   *ai_canonname; 
    struct addrinfo *ai_next; 
}; 
+1

看看文檔,在頁面的最後http://man7.org/linux/人爲頁/ man3/GetAd出現drinfo.3.html - 敢於克服TL; DR – alk

回答

2

指針指針的使用是一種常見模式,其中函數使用「out」參數來返回分配內存的地址。這樣做是爲了讓調用者不必預先分配,有時還是未知的大小。

這樣做的典型的用法是經由地址運算符(&)其中使用指針類型是這樣的:

struct addrinfo *result; 
getaddrinfo("foo", "baz", NULL, &result); 

然後,result,這是一個未初始化的變量指向真實存儲器地址,並在代碼後面,它預計它將被釋放的來電者:

freeaddrinfo(result); 
+0

C沒有引用,並且一元'&'運算符在C語境中通常不被稱爲「引用」運算符。事實上,即使在C++中,我也不認爲使用'&'來標記引用類型是符合操作的。該標準引用一元'&'作爲「地址」操作符,在其他地方我經常看到拼寫「地址 - 」。否則,你的解釋是好的。 –

+0

@JohnBollinger答:你是對的。 B.我甚至沒有注意到它是C而不是C++ :-) – Amit

+0

我在下面發表了相同的評論,爲什麼它使用'**'double而不是'*'single雖然,addrinfo結構不是一個指針那麼爲什麼他們在規範中使用了兩倍。 –

2

res是一個指針到你想要的結果(這是自己在指針的形式)存放的地方。因此,你做這樣的事情:

struct addrinfo hints = { .ai_socktype = SOCK_STREAM }; 
struct addrinfo *ai; 
int err_code = getaddrinfo(hostname, service, &hints, &ai)); 

之後,如果沒有錯誤,ai已更新你的結果指向(addrinfo結構的鏈接列表的第一個元素)。

+0

爲什麼'**'加倍,甚至在你的例子中使用'*'單個甚至在「客戶端程序」下的手冊頁http://man7.org/linux /man-pages/man3/getaddrinfo.3.html它使用'struct addrinfo * result,* rp;'這是單一的。我的意思是'struct addrinfo'不是一個指針,所以爲什麼我要聲明'**'加倍,你知道的。 –

+0

@JordanDavis:* res *參數是一個指向存儲結果的地方的指針。結果本身有指針類型。因此參數是一個指向指針的指針。這並不意味着結果對象(我的示例代碼中的'ai')應該是雙指針類型。相反,你傳遞它的地址*,'&ai',它的類型是「指向'ai'類型的指針」,因此指向指向'struct addrinfo' *的指針。 –