有谁能告诉我这些差异:
target_addr.sin_addr = *(struct in_addr *)(target->h_addr_list[0]);
这很有效。
target_addr.sin_addr.s_addr = (unsigned int)(*(target->h_addr));
//h_addr = h_addr_list[0]
这一行没有任何语法错误,但我不知道它是否有效。
target_addr.sin_addr.s_addr = *(struct in_addr *)(target->h_addr_list[0])->s_addr;
为什么这条线不起作用?我认为这条线的含义与上面两条完全相同......
变量来自:
struct hostent *target;
struct sockaddr_in target_addr;
答案 0 :(得分:2)
我并不完全熟悉这些结构,但我可以对指针发表评论。小心所有的演员阵容 - 你真的确定h_addr
存储你认为的是什么?
在你的第三行代码中,s_addr
不是一个指针,你试图将它取消引用,就好像它一样。你的三行代码没有相同的含义。
在这里,您投射 target->h_addr_list[0]
到pointer
struct in_addr
。在演员之后,您现在正在使用pointer
到struct in_addr
。然后,取消引用 pointer
,加载
值为sin_addr
。
在这里,您解除引用 target->h_addr
(作为某人
提到的是target->h_addr_list[0]
)的别名然后
将它转换为unsigned int。
此处您投射 target->h_addr_list[0]
到pointer
struct in_addr
,到目前为止,与#1相同。然后,您访问该字段
s_addr
的{{1}}。这种访问的结果是
值struct in_addr
。
然后,您尝试取消引用该值,但它不是
struct in_addr.s_addr
。我假设您收到间接相关错误?