我正在尝试在我的C程序中打印一些输出。
当我使用cc编译时,我收到此错误:
" whoisclient.c",第70行:参数#1与原型不兼容: prototype:struct in_addr {union {..} S_un}: " /usr/include/arpa/inet.h" ;,第61行参数:指向char的指针
在我的代码的这一部分:
printf("Addresses\n");
int j=0;
while(hp ->h_addr_list[j]!=NULL){
printf("hp_addr_list[%d] = %s\n", j, inet_ntoa(hp->h_addr_list[j]));
j++;
}
我尝试添加星号或添加/删除hp->
,但我没有想法。我不完全理解错误信息以及它说我做错了什么。
答案 0 :(得分:3)
inet_ntoa
函数采用struct in_addr
,其中包含IPv4地址的数字表示,并返回指向包含该IP地址的文本表示的字符串的指针。
h_addr_list
的{{1}}字段是指向字符串指针数组的指针,每个字符串都包含一个IPv4地址。这与struct hostent
期待的内容不兼容。
由于您已经拥有IP地址的字符串表示形式而不是数字表示形式,因此您无需通过inet_ntoa
传递它来进行转换。只需将字符串直接传递给inet_ntoa
:
printf
编辑:
如评论中所述,printf("hp_addr_list[%d] = %s\n", j, hp->h_addr_list[j]);
成员(定义为类型h_addr_list
)实际上是以网络字节顺序指向网络地址的指针数组。这样的元素与char **
的内容相同。因此struct in_addr
需要投放到char *
,然后解除引用:
struct in_addr *