3

我正在使用 libgen.h 中的 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 位,有没有办法解决这个问题?

4

2 回答 2

6

您是否包括包含定义的头文件dirnamelibgen.h在我的系统上,签入/usr/include)?

警告"cast to pointer from integer of different size"听起来像是从一个int,没有定义原型的函数的默认返回代码。

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

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

于 2010-10-29T16:55:39.217 回答
1

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

于 2010-10-29T16:57:20.370 回答