2015-12-02 58 views
0

我正在閱讀本教程:here但我不明白這部分是如何工作的。從char**鑄造到struct in_addr **包含unsigned long似乎很奇怪。C - 鑄造「h_addr_list」數組鍵入「struct in_addr **」

// Cast the h_addr_list to in_addr 
// since h_addr_list also has the ip address in long format only 
addr_list = (struct in_addr **) he->h_addr_list; 

我希望有人能解釋發生了什麼事以及代碼是如何工作的。

編輯:更具體地說:我想知道編譯器如何理解我們要在這裏做什麼?爲什麼這個代碼是正確的?

回答

1

當您撥打gethostbyname時,它會返回指向struct hostent的指針。該結構中的一個字段h_addr_list是一個指向網絡地址的指針數組。

由於網絡地址可以被無論是對IPv4地址爲IPv6地址的struct in_addrstruct in6_addrh_addr_list被定義爲char **爲通用類型可以指向任何一個。 h_addrtype字段告訴你哪一個是有效的。

一旦您知道該數據,您將h_addr_list轉換爲struct in_addr **struct in6_addr **,然後訪問數組中的每個元素。

編輯:

要麼 voidchar類型和任何其它非功能型之間

指針可以自由地澆鑄或彼此。

在此特定情況下,很可能是因爲gethostbyname有一個靜態char緩衝器,它投射到struct in_addr **struct in6_addr **酌情以創建陣列。然後調用函數執行相同的強制轉換以獲取值。

+0

我明白了這一點,問題是這個演員是如何工作的?這有點奇怪,編譯器如何理解它? –

+0

@MichaelHeidelberg看我的編輯。希望這可以讓事情更清楚。 – dbush