2012-07-19 172 views
-1

gethostbyname在Fedora 32位工作正常,但在64位環境中失敗給出分段錯誤?在這種情況下,什麼是問題,我們如何解決它?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; 
} 
+4

向我們顯示代碼。 – unwind 2012-07-19 13:02:20

+1

這意味着你在代碼的某個地方犯了一個錯誤。 – SLaks 2012-07-19 13:02:41

+0

很可能,您提供給'gethostbyname'的名稱已損壞。也許你已經將它存儲在一個整數中並丟失了高位。無論如何,問題出在你的代碼中,而不是'gethostbyname'。 – ugoren 2012-07-19 13:05:22

回答

2

你缺少正確的包括:

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

沒有正確的包括inet_ntoa假設有int返回類型。由於int與x86上的char*具有相同的大小,因此不存在任何問題。這在x86_64上不是這樣,所以通過printf讀取該字符串會導致錯誤。

+1

這個錯誤會被'gcc -Wall -Wextra'給出的警告所捕獲,所以如果你關心編譯器給出的所有警告,你就不會擁有它。 – 2012-07-19 13:44:54

+0

是的,值得一提的是,在C中,「警告」的意思是「錯誤,除非你知道更好」,而且通常不會。 – apmasell 2012-07-19 14:02:37

+0

在那個筆記上,'-Werror'是你的朋友:) – 2012-07-19 16:34:58

相關問題