2013-03-30 2 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; 
} 

Результат работы показал, что: segmentation fault (core dumped). Но я не знаю, как заставить его работать .so мне нужна помощь ...Ошибка сегментации при использовании 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 пытается записать на этот адрес, что приводит к 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 
+0

Благодарим за помощь. Как насчет двух программ ниже? – dsfa24

+1

Вы не можете просто добавлять все новые и новые вопросы к существующему вопросу. Я ответил на вопрос, который вы задали. Если у вас больше, задайте новый вопрос. Я откатил редактирование, чтобы этот вопрос был в его первоначальной форме. Для чего стоит разница между двумя программами, так это то, что для текстового литерала используется строковый литерал, а другой - 'argv [1]'. Поэтому, предположительно, 'argv [1]' содержит нечто иное, чем URL. –

+0

Извините за это. Это мой первый раз, когда я использую этот сайт для решения моего вопроса, чтобы я не разбирался в деталях. В конце концов, спасибо за помощь. – dsfa24