以下代码段中的问题可能是什么?

时间:2011-06-08 12:38:31

标签: c

每当我试图在shell上传递./a.out www.yahoo.com时,以下代码就会出现分段错误...

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

3 个答案:

答案 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)代替。