为什么将变量的地址赋给指针后,打印变量值受printf影响?

发现了一个奇怪的事,求各位解答!

#include  
int main(void)
{
    int a = 1;
    int *p = 0x000000000062FE14;
    *p = 15;
    printf("%p\n",&a);
    printf("%d\n",a);
    return 0;
}

这样的话结果就会是:
000000000062FE14
15
如果把显示a的地址这行注释掉,如:

#include  
int main(void)
{
    int a = 1;
    int *p = 0x000000000062FE14;
    *p = 15;
//    printf("%p\n",&a);
    printf("%d\n",a);
    return 0;
}

结果就会变成:
1
想请各位指点一下这是为什么呢,printf函数会改变什么吗,还是我的编译器的问题呀?
并且从调试的结果来看,在没有注释那一行时,a的地址为(int *) 0x62fe14,注释后,a的地址变成了(int *) 0x62fe1c,为什么printf会导致a的地址产生变化呢?

不是受printf影响。
而是你如果加一个& 取地址符号,就是去这个变量的地址。
如果你加入一个*就会取这个变量的值。

供参考:

#include <stdio.h>
int main(void)
{
    int a = 1;
    //int *p = 0x000000000062FE14;//这是个啥地址,*p 还是一个野指针
    //*p = 15;  //*p是野指针,怎么能赋值,这两句编译不能通过
    printf("%p\n",&a);
    printf("%d\n",a);
    return 0;
}

5,6行你怎么就确保a的地址一定是那个的?

首先昂,你那个很长一串地址,你也不能确保他就是a的地址,直接定义a这样子是在栈区并且是编译器在申请地址和空间,并不是我们用户能决定的,所以不是每次a的地址都会一样,一样的话也纯属巧合。这是我的想法

嗨,看到你的问题,你可能对内存还是不是很了解啊
你的程序每一次跑起来之后,系统会给它分配一个内存。
但是,不是每一次你重新跑的时候,都是这一块内存,所以,你的一长串的那个地址不一定每一次都是a 的,最简单的:
int *p = &a;
这样多好,a 不管怎么变,都是取地址