Unix C - 编译64位中断“dirname”

时间:2010-10-29 16:51:59

标签: c unix gcc 64-bit dirname

我正在使用libgen.h中的dirname从文件名的路径获取目录路径。

这是它的签名:

char * dirname (char *path)

在32位机器上编译或使用带有gcc的-m32时,一切正常。

我的代码如下所示:

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位,有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:5)

您是否包含包含dirname定义的头文件(我系统上的libgen.h,请检入/usr/include)?

警告"cast to pointer from integer of different size"听起来像是来自int,来自未定义原型的函数的默认返回码。

正在发生的事情可能是您的intchar *数据类型对于32位代码的大小相同,但是当您切换到64位时,它们的大小实际上是不同的。

您可以通过打印sizeof(int)sizeof(char*)并查看它们是否不同来验证这一点。

答案 1 :(得分:1)

您未能为dirname提供原型(通过包括libgen.h或自己进行原型设计),因此隐式获取类型int dirname();。由于这与实际功能不匹配,因此您的程序具有未定义的行为。 (在这种情况下,指针的上半部分会被截断。)