2010-10-29 58 views
2

我使用libgen.h中的dirname從文件名路徑中獲取目錄路徑。UNIX C - 編譯64位中斷「dirname」

這是它的簽名:

char * dirname (char *path) 

當在32位機器上編譯或使用-m32用gcc,這一切工作正常。

我的代碼如下所示:

char* path = "/path/to/my/file.txt"; 
char* path_cpy = strdup(path); 
const char* dir = (const char*)dirname(path_cpy); 

如果我編譯一個64位的機器上,我得到警告:

"warning: cast to pointer from integer of different size" 

這將解決這一警告,但崩潰在運行時:

const char* dir = (const char*)(uintptr_t)dirname(path_cpy); 

我從來沒有試過爲32/64位交叉編譯之前,有沒有辦法解決這個問題?

回答

5

您是否包含頭文件,其中包含dirname的定義(即我的系統中的libgen.h,請檢查/usr/include)?

警告"cast to pointer from integer of different size"聽起來像是從int中投射出來的,這是來自沒有定義原型的函數的默認返回碼。

這很可能是因爲你的intchar *數據類型對於32位代碼是相同的大小,但是當你切換到64位時,它們實際上是不同的大小。

您可以通過打印sizeof(int)sizeof(char*)並查看它們是否不同來進行驗證。

+0

你是對的,這解決了我的問題。我明白爲什麼它會突破64位。 – jonathanpeppers 2010-10-29 17:02:39

+0

我沒有得到的是爲什麼你沒有,在你的comile輸出中的某處,像'未定義的引用dirname()'? – Gui13 2012-12-16 10:37:35

1

您未能提供dirname的原型(或者通過包括libgen.h或自己進行原型設計),因此它隱式獲得類型int dirname();。由於這與實際功能不匹配,因此您的程序具有未定義的行爲。 (在這種情況下,指針的上半部分會被截斷。)