我使用的是从libgen.h目录名获取某个文件名的路径的目录路径。

这是它的签名:

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位之前,是有办法解决这一问题?

有帮助吗?

解决方案

您包括包括dirname定义的头文件(这是我的系统,检查libgen.h/usr/include)?

像它的警告声音"cast to pointer from integer of different size"真实从int,从函数的默认返回代码没有定义原型铸造。

这可能是因为发生的事情是,你intchar *数据类型是32位代码相同的大小,但是,当你切换到64位,他们实际上是不同的大小。

您可以通过打印出sizeof(int)sizeof(char*),看他们是否是不同的验证这一点。

其他提示

您未能提供dirname原型(通过包括libgen.h或原型它自己),所以它含蓄地获得式int dirname();。由于这不符合实际的功能,你的程序有不确定的行为。 (在这种情况下,指针的上半部分被截断。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top