2013-03-30 32 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