【问题标题】:Argument is incompatible with prototype: struct in_addr参数与原型不兼容:struct in_addr
【发布时间】:2017-10-15 03:36:50
【问题描述】:

我正在尝试在我的 C 程序中打印一些输出。

当我用 cc 编译时,我得到这个错误:

“whoisclient.c”,第 70 行:参数 #1 与原型不兼容: 原型: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->,但我没有想法。我不完全理解错误消息以及我做错了什么。

【问题讨论】:

  • 你为什么不用getaddrinfo
  • 请在您的问题上标记第 70 行和第 61 行。
  • h_aliases[i] 也未初始化使用。 (应该是while(hp->h_aliases[i]!=NULL)
  • @DavidC.Rankin 你说得对!谢谢。
  • inet_ntoa() 的原型是char *inet_ntoa(struct in_addr in); 注意参数是一个结构的实例。 (该实例只包含一个uint32_t 字段,但是,必须传递一个结构的实例,您还没有向我们展示您的其余代码,因此我们无法准确确定您做错了什么。

标签: c


【解决方案1】:

inet_ntoa 函数采用 struct in_addr,其中包含 IPv4 地址的数字表示,并返回指向包含该 IP 地址的文本表示的字符串的指针。

struct hostenth_addr_list 字段是指向字符串指针数组的指针,每个字符串都包含一个 IPv4 地址。这与 inet_ntoa 所期望的不兼容。

由于您已经有了 IP 地址的字符串表示形式而不是数字表示形式,因此您无需通过 inet_ntoa 对其进行转换。直接把字符串传给printf

printf("hp_addr_list[%d] = %s\n", j, hp->h_addr_list[j]);

编辑:

正如cmets中提到的,h_addr_list成员,定义为char **类型实际上是一个指向网络字节顺序的网络地址的指针数组。这样的元素与struct in_addr 的内容相同。所以char * 需要转换为struct in_addr * 然后取消引用:

printf("hp_addr_list[%d] = %s\n", j, inet_ntoa(*((struct in_addr *)hp->h_addr_list[j])));

【讨论】:

  • 你写得比我快。干得好。 (您也可以更快地查找内容:)
  • 再深入一点可能会发现hp->h_addr_list[j]network-byte-order中,实际输出为字符串,你会得到printf("hp_addr_list[%d] = %s\n", j, inet_ntoa(*(struct in_addr*)hp->h_addr_list[j]));
猜你喜欢
  • 2015-03-01
  • 2016-03-25
  • 1970-01-01
  • 2018-09-07
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
相关资源
最近更新 更多