【问题标题】:Unix C - Compiling for 64 bit breaks "dirname"Unix C - 编译 64 位中断“目录名”
【发布时间】:2023-04-10 23:14:01
【问题描述】:

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

【问题讨论】:

    标签: c unix gcc 64-bit dirname


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你是对的,这解决了我的问题。我明白为什么它会在 64 位上中断。
    • 我不明白为什么你没有,在你的comile输出的某个地方,像Undefined reference to dirname()
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-13
      • 2023-03-06
      • 1970-01-01
      • 2018-05-02
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      相关资源
      最近更新 更多