inet_ntoa的分段错误

#include  #include  /* for strncpy */ #include  #include  #include  #include  #include  int main() { int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_DGRAM, 0); /* I want to get an IPv4 IP address */ ifr.ifr_addr.sa_family = AF_INET; /* I want IP address attached to "eth0" */ strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); ioctl(fd, SIOCGIFADDR, &ifr); close(fd); /* display result */ char* ipaddr; ipaddr = inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); printf("%s\n", ipaddr); return 0; } 

这条线:

  ipaddr = inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); 

我明白了

 iptry.c: In function 'main': iptry.c:31:9: warning: assignment makes pointer from integer without a cast [enabled by default] 

并为

  printf("%s\n", ipaddr); 

我得到分段错误。

这有什么问题?

inet_ntoa在头文件
需要#include ,否则会有错误

inet_ntoa不需要指针,而是值

  char* ipaddr; ipaddr = inet_ntoa(((struct sockaddr_in)(ifr.ifr_addr))->sin_addr); 

如果sin_addr是一个指针,你需要取消引用它。

如果出现错误, inet_ntoa将返回NULL ,因此尝试printf为NULL将导致分段错误…

在这里查看信息, 这里是man-page。

如果您不想看警告,只需转换inet_ntoa的返回值

 ipaddr = (char *) inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); 

分段错误可能是因为某些先前的函数返回错误(空值)而您没有检查它

相同的代码在我的Linux Box中运行。