将指针转换为更大的int

我有一个指针。 在32位系统上,它是32位。 在64位系统上,它是64位。

我有一个很长的整数字段用作标识符,有时我想在那里使用指针值。 (我从来没有回到指针 – 一旦我将它转换为整数字段,我只是将它与相等性进行比较)。

在32位和64位系统上,这样做似乎是安全的。 (在较大的指针系统上不是这样)。 真的吗?

然后,有没有办法让GCC只在建立安全的平台(目前是所有目标平台)时才给出以下警告?

错误:从不同大小的整数转换为指针[-Werror = int-to-pointer-cast]

根据标准,不能保证指针适合整数类型。 实际上,在大多数个人计算机上,存在几种存储器模型 。 您可以看到指针和整数类型的大小并不总是相同(即使在“常规”计算机上)。

您应该使用C99中的可选类型intptr_tuintptr_t

C11(n1570),§7.20.1.4

以下类型指定一个带符号的整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void指针,结果将等于原始指针: intptr_t

以下类型指定无符号整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void指针,结果将等于原始指针: uintptr_t

这是一个小例子:

 #include  #include  int n = 42; int *p = &n; intptr_t i = (intptr_t)(void *)p; int *q = (void *)i; printf("%d\n", *q); 

如果你想要一个保证大到足以容纳指针的整数类型,可以考虑intptr_t (signed)或uintptr_t 。 该标准保证这些数据类型足以容纳指针。 没有其他任何东西可以假设,尤其不是那么long int足够长。