将指针转换为更大的int

Ben*_*ord 8 c

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

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

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

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

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

md5*_*md5 10

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

你还是使用可选的类型intptr_tuintptr_t,从C99.

C11(n1570),§7.20.1.4

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

下面的类型指定一个无符号整数类型,其属性是任何有效指针void都可以转换为此类型,然后转换回指针void,结果将比较原始指针: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);
Run Code Online (Sandbox Code Playgroud)