代码之家  ›  专栏  ›  技术社区  ›  jonathanpeppers

unix c-编译64位中断“dirname”

  •  2
  • jonathanpeppers  · 技术社区  · 14 年前

    我使用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位的交叉编译,有没有解决这个问题的方法?

    2 回复  |  直到 14 年前
        1
  •  5
  •   paxdiablo    14 年前

    dirname libgen.h /usr/include

    "cast to pointer from integer of different size" int

    char *

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

        2
  •  1
  •   R.. GitHub STOP HELPING ICE    14 年前

    您未能提供 dirname (包括 libgen.h 或者自己制作原型),所以它隐式地得到类型 int dirname(); . 因为这与实际函数不匹配,所以您的程序具有未定义的行为。(在这种情况下,指针的上半部分会被截断。)