返回此指针赋值的地址是什么?

时间:2016-04-15 14:20:39

标签: c pointers

前几天我正在玩指针并提出以下代码,我明确地将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

我的问题是第二个地址是什么以及那里包含的是什么?

4 个答案:

答案 0 :(得分:5)

垃圾 - 您打印出未初始化变量的值。这完全是巧合,它看起来像你的另一个地址;初始化d以获得有意义的答案。

答案 1 :(得分:2)

在第二次打印中,您不打印地址,而是转换为地址的值!

在第一个赋值中,您将获取变量的地址,这只是一些RAM地址。在第二个赋值中,您将变量的值转换为指针。由于变量未初始化,因此位于该RAM地址的垃圾值。

答案 2 :(得分:1)

它只是内存中的随机地址,因为d未初始化。

答案 3 :(得分:0)

正如其他人所指出的那样,您正在将一个不确定的值转换为指针。执行该转换,或者实际上使用该值除任何之外的其他会产生未定义的行为。

如果在转换之前设置了d的值,那么C显式允许将整数转换为指针就很重要了。但是,对于这种情况和大多数其他情况,标准说:

  

结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。

[C2011,6.3.2.3/5]

所以基本上,不要这样做,除非你足够了解自己可靠地确定你的特定代码组合,C实现,编译和链接选项以及平台的结果。