关于指针的有关问题,请指教

关于指针的问题,请大虾指教!
我定义了两个函数:
char   *   f1()  
{  
      char   a[]= "hello1 ";  
      return   a;  
}  
char   *   f2()  
{  
      char   *s= "hello2 ";  
      return   s;  
}  
int   main()
{  
        char   *s1;
        char   *s2;  
        s2=f1();  
        s2=f2();  
        printf(s2);  
        printf(s2);  
        return   0;
}    

对于第一个函数,编译器会提示错误,我也明白他错在哪里了,我想问的是第二个函数,他怎么可以正常的打印出字符串呢,char*   s   不是创建在栈上吗,函数结束后不就成野指针了吗,为什么可以正常打印出来呢?

------解决方案--------------------
第二个函数, s是一个指针, 没有分配内存空间的, 也就无所谓栈上不栈上了, 哪里都不是, 因为根本就没有分配

这个指针指向的是常量区的字符串 "hello2 ", 这个字符串在整个程序的运行时期都存在, 所以可以正确显示

这两个函数的区别是: 第一个在栈中分配了内存, 并将这个内存中的数据初始化为 "hello1 "
第二个根本没有分配内存