#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);
}
为什么这段代码会给我一个分段错误?
直到输出官方名称,没关系。但在那之后,它给了我一个错误。
我认为此源代码中没有语法问题。那有什么问题呢?
答案 0 :(得分:2)
假设一个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>
编译器很可能会警告你这件事。严肃对待此类警告并修改代码,直到不再发出警告为止。