gpt4 book ai didi

c - gethostbyname() 段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:46 24 4
gpt4 key购买 nike

#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);
}

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

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

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

最佳答案

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

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

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

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

或者只包含适当的标题

#include <arpa/inet.h>

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

关于c - gethostbyname() 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36260645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com