有关数组和指针的一些有关问题

求助:有关数组和指针的一些问题
[code=C/C++][/code]
#include <stdio.h>
#include <string.h> 
int main() 
{
  char *fun1();
  printf("%s\n", fun1());
  return 0;
}
 char *fun1()
{
(1)// char str[]="ABC";
(2) char *str="ABC";
  return (str);
 }
如上代码所示:当fun1中使用(1)语句时打印出来的是乱码,使用(2)语句时能正确打印出来,为什么呢?
个人理解:虽然(1)中的str是局部变量,退出fun1的时候它的内存会被回收,但是里面的内容并没有被销毁,而fun1返回的是str,也就是数组的首地址,按理说再次调用的时候通过此地址还是能找回原内容的,但是为什么回打印出乱码呢?还是我的理解有误,希望前辈们不吝赐教。谢谢了。

------解决方案--------------------
传出局部对象的指针或引用都是危险的
C/C++ code
#include <stdio.h>
int main()  
{
  char const *fun1();
  printf("%s\n", fun1());
  return 0;
}

char const *fun1()
{
  return "ABC";
}

------解决方案--------------------
str是局部变量,退出fun1的时候它的内存会被回收,但是里面的内容并没有被销毁

那指针指向的就不能保证是什么值了,或许是正确,或许是乱码。

char *str="ABC";
这个不是存放在栈内存中,函数结束没有消失。
------解决方案--------------------
探讨

哦,,谢谢一楼的提醒,不过我只是练习数组和指针。
5楼,看完你得解答我是这样想的:
(1)是定义一个局部的数组,它的地址是随着每次调用fun1而不同的,而“ABC”是常量,其内存是在全局数据区里面,不会随着fun1的退出而回收,所以能正确打印。
这样就似乎能讲的通了,不知道我的理解对不对。