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中运行。