2013-03-30 34 views
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 = NULL; 
    ptr = argv[1]; 
    inet_aton(ptr,hipaddr); 
    hptr = gethostbyaddr(hipaddr, 4, AF_INET); 
    printf("official hostname:%s\n",hptr->h_name); 
    return 0; 
} 

运行结果显示:分段错误(core dumped)。 但我不知道如何使它发挥作用。所以我需要一些帮助......使用gethostbyaddr时的分割错误()

我改变了代码如下:

#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; 
} 

然后,它的作品,但为什么!?

回答

3

在第一个版本中,您将空指针传递给inet_aton。然后inet_aton尝试写入该地址并导致段错误。

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 
+0

谢谢你的帮忙。下面两个程序如何? – dsfa24

+1

您不能只是不断地向现有问题添加越来越多的问题。我回答了你问的问题。如果你有更多,请提出一个新问题。我回滚了编辑,以便此问题以其原始形式显示。对于这两个程序之间的区别,值得一提的是一个使用URL的字符串文字,另一个使用'argv [1]'。所以大概'argv [1]'包含了除URL之外的其他东西。 –

+0

对不起。这是我第一次用这个网站解决我的问题,所以我不明白规则的细节。毕竟,谢谢你的帮助。 – dsfa24