关于c语言内存分配的一个有关问题

关于c语言内存分配的一个问题
有个函数:
char *getString()
{
  char str[20]="I love Fanta";
  return str;
}
在main函数中调用它,如下:
int main()
{
  char *buffer;
  buffer=getString();
  printf("%s\n",buffer);
}
此时打印输出的是乱码,这是因为str指针是局部变量,存在于栈中,当getString函数执行完后被释放了。但是当把
char str[20]="I love Fanta";改为char *str="I love Fanta";后却能打印输出I love Fanta,此时str也是局部变量,也是
存在于栈中,当getString函数执行完后也会被释放,为什么却能输出I love Fanta呢?求解

------解决方案--------------------
第一种
char str[20]="I love Fanta";
str是一个数组,它在栈内存中,它的内容是那个字符串,在执行完这个函数的代码后,栈内存就会被释放,返回的是一个野指针。

第二种
char *str="I love Fanta";
str是一个指针,而"I love Fanta"存放在字符常量区,str中存放的是这个字符串在字符常量区中的地址,在返回主函数后,字符常量区是不会有任何改变的,返回的也是指向字符常量区的指针,因此可以得到想要的效果。
------解决方案--------------------
c 语言函数间传递的是数值 (参数,返回值)。两次返回的都是指针值,唯一不同之处是:一个指向即将销毁的 stack, 一个指向常量区
------解决方案--------------------
第一种是函数的局部变量,编译器会有警告:[Warning] address of local variable `str' returned --返回地址局部变量STR“

第二种如楼上所说,存放在字符常量区。
------解决方案--------------------
探讨
有个函数:
char *getString()
{
char str[20]="I love Fanta";
return str;
}
在main函数中调用它,如下:
int main()
{
char *buffer;
buffer=getString();
printf("%s\n",buffer);
}
此时打印输出的是乱码……

------解决方案--------------------
第二个:指针的值在栈上但是指针指向的内容在静态区。这个指针是一个整形值表示地址单元的位置,这个值是存储在栈上的。

第一个:整个char数组里的所有数据都在栈里。