【发布时间】:2015-01-27 18:30:13
【问题描述】:
如果我知道一个数据对象的地址,我是否可以将地址存储为整数并将该整数作为指针进行操作?
例如,
void main(){
long a = 101010;
long *p = &a;
long b = p;
printf("%lld\n", *(long*)b);
}
它总是安全的吗?
评论:long b = p; 产生警告:
Initialization makes integer from pointer without a cast
但是,程序会打印101010。
【问题讨论】:
-
语言标准中没有规定指针始终可以转换为整数。这只是一个巧合,就像 int 出于某种原因现在很久了。
-
这段代码应该会产生一个关于使用指针作为整数而不进行强制转换的警告。
-
如果您将此代码放在文件中并对其进行编译(启用警告),编译器会将代码标记为不正确。那么就没有必要问这个问题了
-
没有什么是总是安全的;当然,指针不只是
integer,但它始终可以表示为integer(它可能是int或long,甚至是30位值,但你可以声明这是一个integer)。 -
在非线性寻址架构(例如 x86 实模式)中,指针甚至可能不是单个数字。例如(再次)在 x86 实模式下,所谓的“FAR”指针是段地址和段内偏移量的组合。