每当我试图在shell上传递./a.out www.yahoo.com时,以下代码就会出现分段错误...
main(int c,char *argv[])
{
struct hostent *ptr;
ptr = gethostbyname(argv[1]);
printf("%s\n", ptr->h_name);
}
答案 0 :(得分:9)
如果为NULL,则应检查返回值(ptr)(gethostbyname在出错时返回NULL)。当函数返回NULL时,您可以检查h_errno以查看到底发生了什么。另见:http://www.manpagez.com/man/3/gethostbyname/
您还应检查命令行参数的数量,以便将参数传递给gethostbyname函数:
if(c < 2) {
/* print an error */
return 1;
}
答案 1 :(得分:1)
您确定要将参数传递给应用程序的命令行吗?
修改强>
您还必须检查gethostbyname()
是否返回NULL。
答案 2 :(得分:1)
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)代替。