我正在使用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位,有没有办法解决这个问题?
答案 0 :(得分:5)
您是否包含包含dirname
定义的头文件(我系统上的libgen.h
,请检入/usr/include
)?
警告"cast to pointer from integer of different size"
听起来像是来自int
,来自未定义原型的函数的默认返回码。
正在发生的事情可能是您的int
和char *
数据类型对于32位代码的大小相同,但是当您切换到64位时,它们的大小实际上是不同的。
您可以通过打印sizeof(int)
和sizeof(char*)
并查看它们是否不同来验证这一点。
答案 1 :(得分:1)
您未能为dirname
提供原型(通过包括libgen.h
或自己进行原型设计),因此隐式获取类型int dirname();
。由于这与实际功能不匹配,因此您的程序具有未定义的行为。 (在这种情况下,指针的上半部分会被截断。)