【问题标题】:something about inet_ntoa()关于inet_ntoa()
【发布时间】:2012-06-15 11:18:35
【问题描述】:

我使用函数char* inet_ntoa(struct in_addr in), 编写了一个服务器,当我包含标题时 <sys/socket.h><netinet/in.h> ,可以生成带有编译器警告的可执行二进制文件,但是当程序处理来自inet_ntoa 的返回字符串时会发生段错误。但是当我添加标题 <arpa/inet.h>, 时,一切似乎都正常。

怎么了?

【问题讨论】:

  • 你调试了吗?通过 valgrind 运行它?
  • manual page 告诉您需要<arpa/inet.h>,如果您遇到问题,请务必阅读您使用的功能的手册页。
  • 我还建议您改用inet_ntop,因为它可以处理不同的协议(如 IPv6)并且是线程安全的。
  • 我猜你没有检查编译器警告信息...

标签: c linux unix


【解决方案1】:

arpa/inet.h 包含char* inet_ntoa(struct in_addr in) 的声明。如果你不包含这个头文件,你的编译器将使用隐式声明int inet_ntoa()。错误的声明很容易导致段错误,特别是如果你在sizeof(int)!=sizeof(void*)的系统上。

如果您使用gcc,您可以添加-Wall 标志。 gcc 会警告你不要使用没有明确声明的函数。

【讨论】:

  • 什么是隐式声明“int inet_ntoa()”?
  • 如果您使用未声明的函数,C 编译器将假定它接受任何参数并返回 int。这称为隐式声明。与在使用之前正确声明函数时的显式声明相反。
  • 但是,即使编译通过了,如果没有函数定义,怎么能继续链接呢?
  • 你有一个定义。它在您的系统库中。即使声明不匹配,也会进行链接。
猜你喜欢
  • 1970-01-01
  • 2011-01-31
  • 2014-05-30
  • 1970-01-01
  • 2011-02-14
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多