微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 查找主机名和IP地址时出现分段错误

我有以下代码获取主机名和IP地址,
#include <stdlib.h>
#include <stdio.h>
#include <netdb.h> /* This is the header file needed for gethostbyname() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>


int main(int argc,char *argv[])
{
struct hostent *he;

if (argc!=2){
printf("Usage: %s <hostname>\n",argv[0]);
exit(-1);
}

if ((he=gethostbyname(argv[1]))==NULL){
printf("gethostbyname() error\n");
exit(-1);
}

printf("Hostname : %s\n",he->h_name); /* prints the hostname */
printf("IP Address: %s\n",inet_ntoa(*((struct in_addr *)he->h_addr))); /* prints IP address */
}

但是我在编译期间收到警告:

$cc host.c -o host
host.c: In function ‘main’:
host.c:24: warning: format ‘%s’ expects type ‘char *’,but argument 2 has type ‘int’

然后在运行代码时出现分段错误

./host 192.168.1.4
Hostname : 192.168.1.4
Segmentation fault

代码中的错误是什么?

解决方法

关于printf格式不匹配的警告是一个重要的警告.
在这种情况下,它是因为编译器认为函数inet_ntoa返回一个int,但您指定期望格式字符串中的字符串.

inet_ntoa的错误返回类型是旧C规则的结果,该规则声明如果您尝试使用没有事先声明的函数,则编译器必须假定该函数返回一个int并且取一个未知(但固定)的数字参数.
假定的返回类型与函数的实际返回类型之间的不匹配会导致未定义的行为,这表现为您的案例中的崩溃.

解决方案是包含inet_ntoa的正确标头.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐