难道这次又是运气好?——返回栈指针居然结果正确了解决方法

难道这次又是运气好?——返回栈指针居然结果正确了
#include <stdio.h> 
#include <string>
char * Func(void)
{
char* str="Hello World"; 
return str;
}

void main()
{
char *a;
a=Func();
printf("a=%s\n",a);
printf("strlen(Func())=%d\n",strlen(Func()));

}

输出结果
a=Hello World
strlen(Func())=11

我用的vc6.0,这太诡异了,返回栈指针居然结果正确了,难道return之后没释放吗?还是我运气好?
我的程序若是改成:
#include <stdio.h> 
#include <string>
char * Func(void)
{
char str[20]="Hello World"; 
char* p=str;
return p;
}

void main()
{
char *a;
a=Func();
printf("a=%s\n",a);
printf("strlen(Func())=%d\n",strlen(Func()));

}
谁能解释?

------解决方案--------------------
存放的地方不同,结果当然不同。
char * Func(void)
{
char* str="Hello World"; //这个存放在常量空间。
return str;
}

har * Func(void)
{
char str[20]="Hello World"; //这个存放于栈空间。
char* p=str;
return p;
}