(long *)(host->h_addr)
意思是解释host->h_addr
作为指向 a 的指针long
。这不是很便携,但大概是long
在为其编写的系统上长度为 32 位。
额外的星星在*(...)
取消引用现在的 along
用于分配。这有效地复制了原始的所有四个字节char
数组变成单个long
value addr.sin_addr.s_addr
。相比于(long)(*host->h_addr)
,这只会复制第一个char
元素。
这种技术极难移植。它假定了大小和字节序long
类型。您可能会想从以下事实中得到暗示:s_addr
is a uint32
and do:
addr.sin_addr.s_addr = *(uint32_t *)(host->h_addr);
这实际上并没有好多少,因为字节顺序仍然受到破坏。还,uint32_t
保证持有at least32 位。它可以是任何更大的位数,当您尝试使用副本读取未分配的内存时,这会调用未定义的行为(想象一下复制您的 32 位char
数据为 64 位整数)。
未来有两种选择:
If your char
数组已经是正确的字节顺序(即,你不关心是否h_addr[0]
表示本地的最高或最低字节uint32_t
), use memcpy
:
memcpy(&(addr.sin_addr.s_addr), host->h_addr, 4);
这可能就是您需要的方法。另一方面,如果你想要h_addr[0]
为了始终以最高字节结束,您需要尊重系统的字节顺序:
addr.sin_addr.s_addr = (host->h_addr[0] << 24) + (host->h_addr[1] << 16) + (host->h_addr[2] << 8) + (host->h_addr[3]);
可能需要一些演员阵容uint32_t
一路上那里。