В чем может быть проблема в следующем фрагменте кода? - PullRequest
1 голос
/ 08 июня 2011

Следующий фрагмент кода выдавал ошибку сегментации всякий раз, когда я пытался передать ./a.out www.yahoo.com в оболочке ...

 main(int c,char *argv[])
 {
     struct hostent *ptr;
     ptr = gethostbyname(argv[1]);
     printf("%s\n", ptr->h_name);
 }

Ответы [ 3 ]

9 голосов
/ 08 июня 2011

Вам следует проверить возвращаемое значение (ptr), если оно равно NULL (gethostbyname возвращает NULL при ошибке).Когда функция возвращает NULL, вы можете проверить h_errno, чтобы увидеть, что именно произошло.См. Также: http://www.manpagez.com/man/3/gethostbyname/

Вы также должны проверить количество аргументов командной строки перед тем, как передать аргумент в функцию gethostbyname:

if(c < 2) {
    /* print an error */
    return 1;
}
1 голос
/ 09 июня 2011
  • Проверить, переданы ли два параметра в качестве параметров командной строки
  • Проверьте, вернул ли gethostbyname действительный указатель, и сообщите о проблеме при необходимости

.

int main(int argc,char *argv[])
{
   struct hostent *ptr;

   /* Check if there is enough argument */
   if (argc != 2)
   {
     printf ("\nusage: %s <host_name>\n", argv[0]);
     exit (1);
   }

   /* fill up hostent structure */
   ptr = gethostbyname(argv[1]);

   /* Check if we have a valid one */
   if (ptr != NULL)
   {
     printf ("\n%s\n", ptr->h_name);
   }
   else
   {
     /* Print the error */
     printf ("\n%s", hstrerror (h_errno));
   }

   printf ("\n");
   return 0;
}

Это работает здесь, в моей системе с gcc file.c -Wall -Wextra и ./a.out говорит

usage: ./a.out <host_name>

А ./a.out yahoo.com рассказывает

yahoo.com

EDIT1: Руководства говорят ...

Функции gethostbyname * () и gethostbyaddr * () устарели. Приложения должны использовать вместо этого getaddrinfo (3) и getnameinfo (3).

1 голос
/ 08 июня 2011

Вы уверены, что передаете аргумент в командную строку приложения?

EDIT
Вы также должны убедиться, что gethostbyname() не возвращает NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...