auto变量地址初始化static静态指针的一些事,该如何处理

auto变量地址初始化static静态指针的一些事
在C语言中如果我们用auto变量地址初始化static静态指针是不对的。
例如:
#include <stdio.h>
int main(){
    int a=0;
    static int*p=&a;
    return 0;
}
==[223]==root@gaoke:~$gcc -o test gaoke.c
gaoke.c: In function ‘main’:
gaoke.c:4: error: initializer element is not constant
我认为是因为static变量的内存是在编译期间就已经确定的,但是这里p指向的是a的地址,在编译期间,a的内存还没有分配,导致出错
但是c++呢??我们来看一看
#include <iostream>
using namespace std;
int main(){
    int a=10;
    static int*p=&a;
    cout<<*p<<endl;
    return 0;
}
==[223]==root@gaoke:~$g++ -o test test.cpp 
==[223]==root@gaoke:~$./test 
10
这个又作何解释?如果是编译器的原因,而不是语言本身怎么解释?
指针 C++ 编程语言

------解决方案--------------------
答案在这里