Eclipse+MinGW环境开发C遇到的一个奇怪的指针Bug有关问题…

Eclipse+MinGW环境开发C遇到的一个奇怪的指针Bug问题……
我用的是eclipse-cpp-galileo-SR2-win32 + MinGW-5.1.6 来搭建C/C++开发环境的,
刚才学指针时遇到个奇怪的问题:用到了两个文件:
_Main.c源代码如下:

#include <stdio.h>

int main() {
int res = main_Pointer();
return res;
}

Pointer.c源代码如下:

#include <stdio.h>

static void fun1() {
//double dou = 1.0;
int a = 0, b = 0;
int *p1 = &a, *p2, *p3;//*ps奇迹般的可以直接*p3=1(必须是这个位置),...

printf("a=%d,*p1=%d\n", a, *p1);
a = 1;
printf("a=%d,*p1=%d\n\n", a, *p1);

//*p2 = 1;//必须先初始化指针
//printf("b=%d,*p2=%d\n", b, *p2);
p2 = &b;
printf("b=%d,*p2=%d\n", b, *p2);
*p2 = 2;
printf("b=%d,*p2=%d\n\n", b, *p2);

*p3=1;
p3 = &*p2;
printf("b=%d,*p2=%d,*p3=%d\n", b, *p2, *p3);
}

int main_Pointer() {
fun1();
return 0;
}


注意"*p3=1;"这一语句,原本在*p3初始化之前不能赋值的,但在上面搭建的环境下居然可以成功执行……

但是在*p3之前增加某些变量(如注释掉的double)或删掉某些变量或更改*p3的声明位置的情况下,执行就会报错……

若是将2文件改为只有1个,也就是取消_Main.c调用后者,把后者改为入口,执行报错……

同时,将源代码拷贝到MS C++ 6.0上去执行报错……

由此观之,上述的BUG是在极其小的概率之下发生的,这是MinGW-5.1.6的C编译器的一个Bug吗?


------解决方案--------------------
lz 应该明白程序运行不报错不代表程序就是正确的

指针没有赋值就访问,这是明显不对的

本来没有初始化的局部变量值是任意的

没有报错,只能说明未赋值前 p3 指向的内存空间不是受保护的
------解决方案--------------------
这不是MinGW-5.1.6的C编译器的一个Bug.C语言的一个历史的方针是“信任程序员”.关于指针的使用是否正确由程序员决定,而不是由编译器来决定.
编译器在栈上分配p3,其值是栈上的随机值,如果它碰巧是一个可访问的地址,那么不出错.如果增加某些变量,那么p3的位置变了,其值不是一个可访问的地址,那么就出错了.LZ可以打印p3的地址来观察差别.
VC编译器对p3这些指针插入了把其值初始化为0xCCCCCCCC(非法地址)的代码,因此指针没有赋值就访问则必然出错.