gethostbyname
在fedora 32位中工作正常,但在64位环境下失败会产生分段错误?在这种情况下,问题是什么,我们如何解决它?
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
struct hostent *he;
struct in_addr a;
int main (int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "usage: %s hostname\n", argv[0]);
return 1;
}
he = gethostbyname (argv[1]);
if (he) {
printf("name :- %s\n", he->h_name);
while (*he->h_aliases)
printf("alias:- %s\n", *he->h_aliases++);
while (*he->h_addr_list) {
bcopy(*he->h_addr_list++, (char *) &a, sizeof(a));
printf("address:- %s\n", inet_ntoa(a));
}
}
else
herror(argv[0]);
return 0;
}
答案 0 :(得分:2)
您缺少正确的包含:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
如果没有正确的包含,则假定inet_ntoa
的返回类型为int
。由于int
与x86上的char*
大小相同,因此没有问题。在x86_64上不是这样,因此printf
读取该字符串会导致错误。