C 指针大小、方法内部的32位与64位指针大小以及方法的返回值

C 指针大小、方法内部的32位与64位指针大小以及方法的返回值,c,pointers,C,Pointers,我有办法 **int** create_object(Object* parent, char* name, int type, int start_block) { ... return ptr_to_object; } 在函数ptr_to_object内部,它似乎是一个32位的对象,但一旦从中取出,它看起来就像它的64位 注意:我不能使用c99,我知道intptr\t是c99的一部分 你有什么建议?谢谢 就像@nos说的,如果你在处理指针,那么就使用指针类型。将它们转换为整数是不可

我有办法

**int** create_object(Object* parent, char* name, int type, int start_block) {
  ...
  return ptr_to_object;
}
在函数
ptr_to_object
内部,它似乎是一个32位的对象,但一旦从中取出,它看起来就像它的64位

注意:我不能使用c99,我知道
intptr\t
是c99的一部分


你有什么建议?谢谢

就像@nos说的,如果你在处理指针,那么就使用指针类型。将它们转换为整数是不可移植的,并且容易出错

如果您不想让呼叫者知道它是指针(无论如何都不需要挖掘一点),那么使用
typedef
创建一个“句柄”类型或其他类型:

typedef my_ptr* object_handle;

事实上,即使你的“句柄”真的是一个整数,也要这样做。抽象将允许您稍后更改它,而无需修改任何调用代码。

如果您正在处理指针,请使用指针返回类型,或将其“隐藏”在标准定义的int类型中,使其足够大以支持保存指针。这种类型可以存在,但不能保证存在(tmk):

C99 7.20.1.4能够容纳对象指针的整数类型

  • 以下类型指定了一个带符号整数类型,该类型的属性是,指向void的任何有效指针都可以转换为该类型,然后再转换回指向void的指针,并且结果将与原始指针进行比较:

    intptr\t

    以下类型指定了一个无符号整数类型,其属性是指向void的任何有效指针都可以转换为该类型,然后再转换回指向void的指针,结果将与原始指针进行比较:

    uintpttr\t

    这些类型是可选的

  • 关键字there是可选的。很可能它是在您选择的平台上定义的,但是对于遗留的可移植性,您最好返回一个
    void*
    ,或者声明一个专门的“句柄”给一个类型化或void指针并返回它


    和往常一样,我对任何使用C99兼容平台的人都非常感兴趣,他们选择不公开标准中作为可选功能提供的某些功能(如此)。如果有人用
    而不是
    和/或
    uintpr\t
    的话,我很好奇。如果您使用这样的工具链,请留下评论。

    ptr\u to\u对象的类型是什么
    ,有什么原因不能返回实际指针而不是整数?(例如,返回一个对象*)不完全是标准的,但通常
    long
    对于指针来说已经足够了。同样,这不是标准的。
    **int**
    这应该是什么类型?@Shahbaz在许多当代平台上都是如此,但它在任何方面都没有标准化。永远不要使用整数来存储指针,如果需要通用指针,请使用
    void*
    。如果指针可以放在int中,标准保证一切正常。但是如果它不适合,那么它是未定义的行为,CPU可以自由停止并着火。