
解释:调用该函数可以从域名返回与此域名相关的地址信息,存储在hostent结构体里,返回结构体在内存中的地址。难点是如何存取和理解结构体中的变量。
char ** h_addr_list :这是一个二级指针,h_addr_list存储了一个指针的地址,而该指针指向一个char型变量。
(2)

h_addr_list 实际上存储的是一个指针数组的首地址,从该地址开始存储了数个指针。32位内存下,每4个字节存储一个地址。64位架构下每8字节储存一个内存地址。显然64位有比32位更大的内存寻址能力。而且奇特的是,指针数组的最后存储了一个空地址,null,表示数组的结束。因为int a[3] ,常规数组a里存三个数,我们是无法确定数组大小的,内存里数据都是连续的。丢掉编译时候的符号表,数组a的大小无从所知。而hostent结构体里,没分量表示指针数组的大小,因此以最后一个空指针表示指针数组的结束。
(3)

这也就解释了22 与26 行,为什么可以在for循环里如此引用h_addr_list中的值。而如h_addr_list[3],到底是内存地址从h_addr_list加12还是24字节,跟32位cpu还是64位cpu有关。这不是我们需要考虑的。但编译器编译此段代码会正确的解析到h_addr_list开始的每个内存地址值。
(4)

h_addr_list被定义为 char **,更合适的是定义为 (void * * )a,表示a存储了指针的地址,而指针又指向了某种不明确的变量。但早期没有这样的c语法。故以字节形式的char代替。
伊圣雨《TCP/IP网络编程》域名解析解释
于 2022-11-14 00:12:07 首次发布
本文详细解析了C语言中二级指针h_addr_list在hostent结构体中的作用,阐述了其作为指针数组的特性。在32位和64位系统下,指针占用的字节数不同,但通过空指针作为数组结束标志来确定数组长度。文章还探讨了使用char**替代(void**)的由来。通过对h_addr_list的分析,展示了如何在循环中安全地访问指针数组的内容。

1884

被折叠的 条评论
为什么被折叠?



