前几天我正在玩指针并提出以下代码,我明确地将int
变量强制转换为int *
并打印出明确转换变量的地址
#include <stdio.h>
int main (void)
{
int d;
int *p1, *p2;
printf("%p\n", p1 = &d);
printf("%p\n", p2 = (int *) d);
return 0;
}
这是输出:
ffbff71c
ffbff878
我的问题是第二个地址是什么以及那里包含的是什么?
答案 0 :(得分:5)
垃圾 - 您打印出未初始化变量的值。这完全是巧合,它看起来像你的另一个地址;初始化d
以获得有意义的答案。
答案 1 :(得分:2)
在第二次打印中,您不打印地址,而是转换为地址的值!
在第一个赋值中,您将获取变量的地址,这只是一些RAM地址。在第二个赋值中,您将变量的值转换为指针。由于变量未初始化,因此位于该RAM地址的垃圾值。
答案 2 :(得分:1)
它只是内存中的随机地址,因为d未初始化。
答案 3 :(得分:0)
正如其他人所指出的那样,您正在将一个不确定的值转换为指针。执行该转换,或者实际上使用该值除任何之外的其他会产生未定义的行为。
如果在转换之前设置了d
的值,那么C显式允许将整数转换为指针就很重要了。但是,对于这种情况和大多数其他情况,标准说:
结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。
[C2011,6.3.2.3/5]
所以基本上,不要这样做,除非你足够了解自己可靠地确定你的特定代码组合,C实现,编译和链接选项以及平台的结果。