Unix下C - 编译为64个分隔符“目录名”
题
我使用的是从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
,从函数的默认返回代码没有定义原型铸造。
这可能是因为发生的事情是,你int
和char *
数据类型是32位代码相同的大小,但是,当你切换到64位,他们实际上是不同的大小。
您可以通过打印出sizeof(int)
和sizeof(char*)
,看他们是否是不同的验证这一点。
其他提示
您未能提供dirname
原型(通过包括libgen.h
或原型它自己),所以它含蓄地获得式int dirname();
。由于这不符合实际的功能,你的程序有不确定的行为。 (在这种情况下,指针的上半部分被截断。)
不隶属于 StackOverflow