Ошибка сегментации при использовании 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 = 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;
}
Тогда это работает! Но почему?
1 ответ
Решение
В первой версии вы передаете нулевой указатель 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