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

最佳答案

您缺少正确的包括:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


如果没有正确的包含,则假定inet_ntoa的返回类型为int。因为int与x86上的char*大小相同,所以没有问题。在x86_64上不是这样,因此printf读取该字符串会导致错误。

10-08 08:13