#include <netdb.h>
#include <stdio.h>
#include <sys/socket.h>
int main(int argc, char **argv)
{
char *ptr = NULL;
struct hostent *hptr = NULL;
struct in_addr *hipaddr = NULL;
ptr = argv[1];
inet_aton(ptr,hipaddr);
hptr = gethostbyaddr(hipaddr, 4, AF_INET);
printf("official hostname:%s\n",hptr->h_name);
return 0;
}
运行结果表明:分段故障(核心转储)。
但我不知道该怎么做所以我需要帮助。。。
我把密码改成:
#include <netdb.h>
#include <stdio.h>
#include <sys/socket.h>
int main(int argc, char **argv)
{
char *ptr = NULL;
struct hostent *hptr = NULL;
struct in_addr hipaddr ;
ptr = argv[1];
inet_aton(ptr,&hipaddr);
hptr = gethostbyaddr(&hipaddr, sizeof(hipaddr), AF_INET);
printf("official hostname:%s\n",hptr->h_name);
return 0;
}
那就行了!但为什么呢?
最佳答案
在第一个版本中,将空指针传递给inet_aton
。然后inet_aton
尝试写入该地址,这将导致segfault。
inet_aton(ptr,hipaddr);//hipaddr is NULL
调用
in_addr
时,需要将指针传递给inet_aton
结构。这就是你在第二个版本中所做的。struct in_addr hipaddr;
inet_aton(ptr, &hipaddr);&hipaddr is a pointer to struct in_addr