C指针总是包含自己的内存地址?

时间:2016-09-12 18:27:06

标签: c pointers initialization

为什么指针p总是指向它自己的内存地址,如下例所示。我无法看到它被初始化的地方,并猜测它将是一个垃圾值。有人可以告诉我为什么它不是垃圾价值。顺便说一句,我在gcc中编译它,-std设置为c99。

#include <stdio.h>

int main() {

    int *p; int a = 4;
    p = &a;
    *p++;
    printf("%d %u\n", *p, p);
}

2 个答案:

答案 0 :(得分:4)

您的问题(正如其他答案所指出的)是*p++;。那要说的是取消引用p然后在p中增加地址。

根据您所看到的情况,我们可以假设p直接在a内存之后

_________________________________________
|something |  a  |  p  | something else |
-----------------------------------------

最终发生的事情是p指向a,然后递增以使其指向自身(或更具体地说:p存储p所在的地址在)。

答案 1 :(得分:0)

首先,您需要使用%p打印指针值,并且您的代码具有未定义的行为。您将指针移到a之后的一个位置并取消引用它。

您的代码并未说明您(看起来)想要的内容,以下内容:

#include <stdio.h>

int main() {

    int *p; int a = 4;
    p = &a;
    printf("%d %p %p\n", *p, p, &p);
}

它产生类似的东西:

4 0x7fff5c17da44 0x7fff5c17da48

p指向a,然后*pa的值。 p的值为0x7fff5c17da44,这是a的地址,p&p)的地址为0x7fff5c17da48