首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sizeof (int) == sizeof (void*)?

sizeof (int) == sizeof (void*)?
EN

Stack Overflow用户
提问于 2009-02-02 10:45:04
回答 10查看 15.6K关注 0票数 14

是否有与指针大小相同的整数类型?在所有微体系结构上都有保证?

EN

回答 10

Stack Overflow用户

发布于 2009-02-02 10:51:21

根据this Wikipedia page的说法,在C99中,您的stdint.h头可能会声明intptr_t和uintptr_t,但这当然需要

选择实现标准的这一可选部分的

  • C99
  • A编译器实现者

所以总的来说,我认为这是一个困难的问题。

票数 16
EN

Stack Overflow用户

发布于 2009-02-02 10:59:34

简单地说,不是。不能保证在所有体系结构上都有。

我的问题是:为什么?如果你想分配一个足够大的类型来存储一个void*,最好的分配方法是(令人惊讶的是:-)一个void*。为什么需要将其放在int

编辑:根据您对重复问题的评论,您希望存储指针(1,2,3)的特殊值,以指示额外信息。

不!!不要这样做!!。不能保证1、2和3不是完全有效的指针。在需要在4字节边界上对齐指针的系统中可能就是这种情况,但是,由于您询问了所有体系结构,因此我假设您具有较高的可移植性。

找一种正确的方法来做这件事。例如,使用union (来自内存的语法可能是错误的):

代码语言:javascript
复制
typedef struct {
    int isPointer;
    union {
        int intVal;
        void *ptrVal;
    }
} myType;

然后,您可以使用isPointer 'boolean‘来决定您应该将联合视为整数还是指针。

编辑:

如果执行速度是最重要的,那么typedef解决方案就是最佳选择。基本上,你必须为你想要运行的每个平台定义你想要的整数。您可以使用条件编译来做到这一点。我还会添加一个运行时检查,以确保您已经为每个平台正确编译(我在源代码中定义它,但您可以将其作为编译器标志传递,如"cc -DPTRINT_INT"):

代码语言:javascript
复制
#include <stdio.h>
#define PTRINT_SHORT
#ifdef PTRINT_SHORT
    typedef short ptrint;
#endif
#ifdef PTRINT_INT
    typedef int ptrint;
#endif
#ifdef PTRINT_LONG
    typedef long ptrint;
#endif
#ifdef PTRINT_LONGLONG
    typedef long long ptrint;
#endif

int main(void) {
    if (sizeof(ptrint) != sizeof(void*)) {
        printf ("ERROR: ptrint doesn't match void* for this platform.\n");
        printf ("   sizeof(void*    ) = %d\n", sizeof(void*));
        printf ("   sizeof(ptrint   ) = %d\n", sizeof(ptrint));
        printf ("   =================\n");
        printf ("   sizeof(void*    ) = %d\n", sizeof(void*));
        printf ("   sizeof(short    ) = %d\n", sizeof(short));
        printf ("   sizeof(int      ) = %d\n", sizeof(int));
        printf ("   sizeof(long     ) = %d\n", sizeof(long));
        printf ("   sizeof(long long) = %d\n", sizeof(long long));
        return 1;
    }

    /* rest of your code here */

    return 0;
}

在我的系统(Ubuntu 8.04,32位)上,我得到:

代码语言:javascript
复制
ERROR: ptrint typedef doesn't match void* for this platform.
   sizeof(void*    ) = 4
   sizeof(ptrint   ) = 2
   =================
   sizeof(short    ) = 2
   sizeof(int      ) = 4
   sizeof(long     ) = 4
   sizeof(long long) = 8

在这种情况下,我知道我需要使用PTRINT_INT (或long)进行编译。也许有一种方法可以在编译时用#if捕捉到这一点,但我现在不愿意费心去研究它。如果你遇到的平台没有足够的整数类型来保存指针,那你就不走运了。

请记住,使用特殊的指针值(1,2,3)来表示整数可能并不是在所有平台上都有效-这实际上可能是指针的有效内存地址。

不过,如果你要无视我的建议,我也没什么办法阻止你。这毕竟是你的代码:-)。一种可能是检查malloc的所有返回值,如果返回值为1、2或3,则再次使用malloc (即,使用mymalloc()自动执行此操作)。这将是一个小的内存泄漏,但它将保证您的特殊指针和真正的指针之间不会发生冲突。

票数 15
EN

Stack Overflow用户

发布于 2009-02-02 11:00:48

C99标准定义了标准的int类型:

7.18.1.4能够保存对象指针的整数类型以下类型指定了带符号的整数类型,其属性是任何指向void的有效指针都可以转换为此类型,然后再转换回指向void的指针,结果将与原始指针相等:

intptr_t

下面的类型指定一个无符号整数类型,该类型具有这样的属性:任何指向void的有效指针都可以转换为该类型,然后再转换回void的指针,结果将与原始指针相等:

uintptr_t

这些类型是可选的。

C99还定义了size_t和ptrdiff_t:

类型包括

ptrdiff_t

它是两个指针减去的结果的带符号整数类型;

size_t

它是sizeof运算符结果的无符号整数类型;以及

我见过的体系结构的最大对象大小等于整个内存,所以sizeof(size_t) == sizeof(==* ),但我不知道有什么东西既可以移植到C89 ( size_t就是),又可以保证足够大( uintptr_t就是)。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/502811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档