#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) вместо этого.