В чем может быть проблема в следующем фрагменте кода?

#c

#c

Вопрос:

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

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

Комментарии:

1. @ThiefMaster: Он может называть это как ему заблагорассудится.

2. В системе Linux, которая нормально строится (и работает нормально) с gcc 4.5 (после добавления #include для netdb.h , sys/socket.h и stdio.h )

3. @DeadMG: Верно, но argc / argv являются стандартом де-факто.

Ответ №1:

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

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

 if(c < 2) {
    /* print an error */
    return 1;
}
  

Ответ №2:

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

Редактировать
Вы также должны проверить, что gethostbyname() не возвращает значение NULL.

Комментарии:

1. whenever i was trying to pass ./a.out www.yahoo.com at the shell...

Ответ №3:

  • Проверьте, переданы ли два параметра в качестве параметров командной строки
  • Проверьте, 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%sn", 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
  

ПРАВКА1:
В руководствах говорится …

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