先看一段容易犯错的代码段:

#include<iostream>
using namespace std;
char* GetMe()
{
 char st[]="hello word!";
 return st;
 
}
int main()
{
 char *str;
 str=GetMe();
 cout<<str<<endl;
 return 0;
}


  该段代码可能输出正确结果,也可能输出错误结果。原因是:GetMe函数中的str是局部变量,分配的是局部数组,他是在内存中的栈中申请的空间,超出该函数作用域之后st的内存空间会被收回,虽然返回的指针仍然指向该内存空间,但是空间中的值随时有可能会被改变,所以输出的有可能是错误结果。修改的方法一种是在全局区域申请内存空间,一种是在堆中申请内存空间。先看在内存的全局区域申请内存空间的代码,至于在堆区分配内存有关文章已经讲了,不再赘述:

#include<iostream>
using namespace std;
const char* GetMe()
{
 char *st="hello word!";
 //*st='t';
 return st;
 
}
int main()
{
 const char *str;
 str=GetMe();
 cout<<str<<endl;
 return 0;
}


  char *st=“hello word!”与上一段代码中的char st[]="hello word!"的区别是char *st=“hello word!”是在内存的全局区域申请的内存空间,全局区域的值是不能进行修改的。如代码中被注释起来的那一行,如果去掉注释,虽然编译时没错误,但是运行时程序会崩溃,因为修改了全局区域的值。所以在全局区域定义了变量之后,该值在程序结束之前是不会被改变的。另外需要普及的常识是:

  程序用来存放数据 的内存分为四块:

  1、全局区(静态区):全局变量和静态变量存储的地方,它与其他变量的不同之处是生命周期的不同,全局区的变量只有在程序结束时系统才会释放该块资源。

  2、文字常量区:常量字符串存放的地方。它也是在程序结束时释放。

  3、栈区:存放函数的参数值,局部变量值等,进入区域分配内存,超出区域收回内存。

  4、堆区:程序员分配程序员释放。

  当然了该题目也可以通过开辟一段静态内存区来实现,它与全局区是同一块内存,只是代码表示方式不同:

#include<iostream>
using namespace std;
const char* GetMe()
{
 static char st[]="hello word!";
 //*st='t';
 return st;
 
}
int main()
{
 const char *str;
 str=GetMe();
 cout<<str<<endl;
 return 0;
}