2010-06-04 128 views
2

我試圖通過使用ether_ntoa打印MAC地址。當我嘗試做ether_ntoa指針投射問題

printf("MAC (src): %s\n",ether_ntoa((struct ether_addr *)&eheader->ether_shost)); 

我得到一個分段錯誤,所以我想出了兩種不同的方法:

這是代碼段Nº1:

struct ether_header *eheader; 
char *p; 
... 
p = ether_ntoa(struct ether_addr *) &eheader->ether_shost); 
printf("-MAC (src): %s\n",p); 

,並警告我獲得的是:

作業指針從 整數沒有投

所以我做演員和...

這是代碼段Nº2:

struct ether_header *eheader; 
char *p; 
... 
p = (char *) ether_ntoa((struct ether_addr *) &eheader->ether_shost); 
printf("-MAC (src): %s\n",p); 

,我獲得警告:

投到指針整數的 不同的大小

如果你看看手冊頁,ether_ntoa這樣定義,返回的char *

extern char *ether_ntoa (__const struct ether_addr *__addr) __THROW; 

,所以我不知道我做錯了。問題在於「不是」警告,是我在嘗試打印時出現的分段錯誤。

我在openSUSE下得到這個錯誤(在ubuntu中我不需要這樣做* p技巧),所以如果在這裏有openSUSE專家,我會很感激她的幫助。

非常感謝!

回答

0

這聽起來像頭/庫和編譯器之間的字符大小不匹配。那臺Suse機器中是否有一些奇怪的64位和32位環境混合?

2

此警告:

assignment makes pointer from integer without a cast 

...是不是邀請加入一個演員。它告訴你一個更嚴重的問題;在這種情況下,編譯器認爲ether_ntoa()返回int

當您在範圍內使用沒有聲明的函數時會發生這種情況;對於這樣的庫函數,這意味着你沒有包含正確的頭文件。對於ether_ntoa(),您需要#include <netinet/ether.h>

+0

有這個確切的問題,解決它與此。我期待編譯器會抱怨隱式聲明。 – Aatch 2011-05-30 02:26:05

0

這是一個圖書館問題。我不知道我怎麼沒有檢查(可能是因爲它是由老師提供的文件,需要所有的庫)。 做的包括:

#include <netinet/ether.h> 

是解決辦法,所以我認爲這個問題的回答。

非常感謝你們倆。