首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gethostbyname()分段故障

gethostbyname()分段故障
EN

Stack Overflow用户
提问于 2016-03-28 10:41:39
回答 1查看 1.1K关注 0票数 2
代码语言:javascript
复制
#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);
}

为什么这段代码会给我一个分割错误?

在官方名字输出之前,没问题。但在那之后,它给了我一个错误。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-28 12:22:32

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

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

要解决这个问题,可以添加缺少的原型:

代码语言:javascript
复制
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

或者仅仅包括适当的标题。

代码语言:javascript
复制
#include <arpa/inet.h>

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36260645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档