2010-10-29 59 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();。由于这与实际功能不匹配,因此您的程序具有未定义的行为。 (在这种情况下,指针的上半部分会被截断。)