我有一个指针.在32位系统上,它是32位.在64位系统上,它是64位.
我有一个长整数字段用作标识符,有时我想在那里使用指针值.(我从来没有回到指针 - 一旦我将它转换为整数字段,我只是将它与相等进行比较).
在32位和64位系统上,这样做似乎是安全的.(在较大的指针系统上不是这样).真的吗?
然后,有没有办法让GCC只在建立安全的平台(目前是所有目标平台)时才给出以下警告?
错误:从不同大小的整数强制转换为指针[-Werror = int-to-pointer-cast]
md5*_*md5 10
根据标准,不能保证指针适合整数类型.实际上,否则,在大多数个人计算机上,存在几种存储器模型.您可以看到指针和整数类型的大小并不总是相同(即使在"常规"计算机上).
你还是使用可选的类型intptr_t和uintptr_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)
| 归档时间: |
|
| 查看次数: |
4819 次 |
| 最近记录: |