我正在阅读本教程:here但我无法理解这部分是如何工作的。从char**
投射到包含struct in_addr **
的{{1}}似乎很奇怪。
unsigned long
我希望有人能够解释发生了什么以及代码如何运作。
编辑:更具体一点:我想知道编译器如何理解我们在这里尝试做什么?为什么这段代码应该正确?
答案 0 :(得分:1)
当您致电gethostbyname
时,它会返回指向struct hostent
的指针。此结构中的一个字段h_addr_list
是指向网络地址的指针数组。
由于网络地址可以是IPv4地址的struct in_addr
或IPv6地址的struct in6_addr
,因此h_addr_list
被定义为char **
作为泛型类型这可以指向任何一个。 h_addrtype
字段会告诉您哪一个有效。
如果您知道这一点,则根据需要将h_addr_list
投射到struct in_addr **
或struct in6_addr **
,然后访问数组中的每个元素。
编辑:
void
或char
类型之间的指针和任何其他非函数类型可以自由地相互转换或相互转换。
在这种特殊情况下,gethostbyname
可能会有一个静态char
缓冲区,它会根据需要转换为struct in_addr **
或struct in6_addr **
以创建数组。然后调用函数执行相同的强制转换以获取值。