我有一个指针。在32位系统上,它是32位。在64位系统上,它是64位。
我有一个很长很长的整数字段用作标识符,有时我想在那里使用指针值。 (我从不回退到指针-将其转换为整数字段后,我只会比较它的相等性)。
在32位和64位系统上,这样做似乎都是安全的。 (在较大的指针系统上不是这样)。真的吗?
然后,是否有一种方法可以让GCC仅在安全的平台(当前为所有目标平台)上构建时才不发出以下警告?
最佳答案
根据标准,不能保证指针适合整数类型。否则,实际上,在大多数个人计算机上,存在几个memory models。您可以看到指针和整数类型的大小并不总是相同的(即使在“常规”计算机上)。
您应该使用C99中的可选类型intptr_t
和uintptr_t
。
这是一个小例子:
#include <stdio.h>
#include <stdint.h>
int n = 42;
int *p = &n;
intptr_t i = (intptr_t)(void *)p;
int *q = (void *)i;
printf("%d\n", *q);
关于将指针转换为更大的int,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13288061/