Ошибка сегментации при использовании 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
Другие вопросы по тегам