C-铸造“;“地址列表”;数组到类型“;“地址**”中的结构;

C-铸造“;“地址列表”;数组到类型“;“地址**”中的结构;,c,unix,struct,casting,network-programming,C,Unix,Struct,Casting,Network Programming,我正在阅读本教程:但我不明白这部分是如何工作的。从char**强制转换到包含无符号long的\u 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; 我希望有人能解释发生了什么以及代码是如何工作的 编辑:更具体地

我正在阅读本教程:但我不明白这部分是如何工作的。从
char**
强制转换到包含
无符号long
的\u 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;
我希望有人能解释发生了什么以及代码是如何工作的


编辑:更具体地说:我想知道编译器如何理解我们在这里要做的事情?为什么这段代码应该是正确的?

当您调用
gethostbyname
时,它返回一个指向
结构hostent
的指针。此结构中的一个字段,
h\u addr\u list
,是指向网络地址的指针数组

由于网络地址可以是IPv4地址的
struct in_addr
,也可以是IPv6地址的
struct in 6_addr
h_addr\u list
被定义为
char**
的泛型,可以指向任何一个。
h_addrtype
字段告诉您其中哪一个是有效的

一旦知道了这一点,您可以将
h\u addr\u list
强制转换为
struct in\u addr**
struct in 6\u addr**
,然后访问数组中的每个元素

编辑:

void
char
类型与任何其他非函数类型之间的指针可以自由地相互转换


在这种特殊情况下,
gethostbyname
可能有一个静态的
char
缓冲区,它将该缓冲区强制转换为\u addr**
中的
struct或6\u addr**
中的
struct(视情况而定),以便创建数组。然后调用函数执行相同的强制转换,以获取值。

我理解这一点,问题是该强制转换如何工作?这有点奇怪,编译器是怎么理解的?@MichaelHeidelberg查看我的编辑。希望这能让事情变得更清楚。