这段代码为什么能执行?该如何处理

这段代码为什么能执行?
#include<stdio.h>
int *b()
{
int a=3;
int *p=&a;
return p;
}
void main()
{
int *p;
p=b();
printf("%d",*p);
}

代码是我乱写的,我用vc6编译结果是3,局部变量不是只在函数体里有效吗?那么函数执行完局部变量应该消失了啊没作用了啊,怎么那个函数返回的地址的指向还是3呢?

------解决方案--------------------
局部自动变量所占内存在作用域外访问的时候,就是读取该处内存数据,如果该处内存没有被重写,还是原来的数据,一旦重写则改变。举个例子:
 
void main() 

int *p; 
p=b(); 

// 在栈上创建一个数组并赋值
int c[1000];
memset(c, 0, sizeof(c)/sizeof(int));

printf("%d",*p); 


上面的输出应该就不是3了