一个面试题 没做来,该怎么解决

一个面试题 没做来
char   *GetMemory(void)
{  
char   p[]   =   "hello   world ";
return   p;
}
void   Test(void)
{
char   *str   =   NULL;
str   =   GetMemory();  
printf(str);
}
请问运行Test函数会有什么样的结果?     谢谢回答!


------解决方案--------------------
输出是随机的,char数组p已经被析构。
换成:
char *GetMemory(void)
{
char *p = "hello world ";
return p;
}
就会输出hello world。
------解决方案--------------------
结果不一定 return p 后 p已经释放了
------解决方案--------------------
返回在栈中申请的数组的地址, 很危险, 当函数运行结束后,会被清理的。
所以返回的一般是垃圾。

------解决方案--------------------
前者是赋值给一个局部作用域的数组
后者是让指针指向常量数据区的字符串,全局作用域
------解决方案--------------------
返回指向“栈内存”的指针,是垃圾
------解决方案--------------------
考察的主要是变量的类型,char p[] = "hello world ";是在函数栈上开辟空间放上相应字符串,当函数返回后,栈空间可能被其他函数占用了,所以输出是随机的。
如果是 char *p= "hello world ";,则是定义了一个字符串常量,(这个字符串放在全局中)p指向的是字符串的地址,由于字符串在全局中,所以函数返回也不会被其他东西覆盖。
------解决方案--------------------
char *GetMemory(void)
{
char p[] = "hello world ";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
-----------------------------
结果可能是乱码。

因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原来的内容已经被清除,新内容不可知
------解决方案--------------------
不能将临时变量的指针作为函数的返回值!
否则,函数执行后得到的是一个未知的不确定的地址!
调用后输出乱码,也可能出现运行错误