【问题标题】:gethostbyname() segmentation faultgethostbyname() 分段错误
【发布时间】:2016-03-28 10:41:39
【问题描述】:
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>

int main(int argc, char** argv)
{
    char    *ptr, **pptr;
    char    str[100];
    struct hostent *hptr;
    int     i=0;

    while(--argc>0)
    {
      ptr=*(++argv);
      if((hptr=gethostbyname(ptr))==NULL)
      {
        printf("gethostbyname() error for host: %s: %s", ptr, hstrerror(h_errno));
        exit(1);
        continue;
      }

      printf("official hostanme: %s \n", hptr->h_name);

      for(pptr=hptr->h_aliases; *pptr!=NULL; pptr++)
        printf("\talias: %s \n", *pptr);

      switch(hptr->h_addrtype)
      {
      case AF_INET:
        pptr=hptr->h_addr_list;

        for(; *pptr!=NULL; pptr++)
          printf("\taddress: %s \n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
        break;

      default:
        printf("unknown addres type");
        break;
      }
    }
    exit(0);
}

为什么这段代码会出现分段错误?

直到正式名称的输出,都可以。但在那之后,它给了我一个错误。

我认为这个源代码没有语法问题。那有什么问题呢?

【问题讨论】:

标签: c unix networking


【解决方案1】:

假设是 64 位平台,代码丢失了 inet_ntop() 返回的指针值的 32 位,因为它不是原型。由于后者,编译器假定它返回了一个int,它很可能只有 32 位宽度,而指针是 64 位。

丢失 32 位会导致返回的指针值无效,因此将其传递给 printf() 会调用未定义的行为,幸运的是导致程序崩溃。

要解决此问题,请添加缺少的原型:

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

或者只包含适当的标题

#include <arpa/inet.h>

编译器很可能会警告您这一点。认真对待此类警告并修复代码,直到不再发出警告为止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多