C++ 指针 数组名 函数内部作用域的问题

下面是两段代码
#include <iostream>
using namespace std;
char * get();
int main(int argc, char *argv[])
{
char *p;
p=get();
cout<<"函数外面的"<<p<<"结束"<<endl;
return 0;
}
char * get(){
char a[]="123";
cout<<"函数里面的"<<a<<"结束"<<endl;
return a;
}
//p没有任何东西
#include <iostream>
using namespace std;
char * get();
int main(int argc, char *argv[])
{
char *p;
p=get();
cout<<"函数外面的"<<p<<"结束"<<endl;
return 0;
}
char * get(){
char *a="123";
cout<<"函数里面的"<<a<<"结束"<<endl;
return a;
}
//p里的字符和a一样
为什么?
我只知道字符数组名是常量,而指针是变量。
但是为什么两个返回回来之后效果不一样呢?
两段代码中的p和数组名的地址,p和指针的地址都是一样的。
就是p和数组名那段代码,会把东西清空, 不大能理解

楼主注意,函数内的局部变量在函数返回时销毁,字符指针a和数组a在get()返回后就没了。
第一个函数的"123"是保存在字符串常量中的,程序中的字符串常量单独存放,不在栈上。第二个函数的"123"在栈上分配的空间。

char * get()
{
//注意下面这句是定义了一个字符指针a,指向一个字符串常量。
//return返回的是a的值,即字符串常量"123"的地址。
char *a="123";
cout<<"函数里面的"<<a<<"结束"<<endl;
return a;
}
============================================
char * get()
{
//注意下面这句是定义了一个字符数组a[3],初始化为"123"
//return返回的是a的地址,然而字符数组a返回后就销毁了,实际上返回了一个野指针。
char a[]="123";
cout<<"函数里面的"<<a<<"结束"<<endl;
return a;
}
//野指针就是不知道指向哪里的指针,它如果指向没权限访问的地方(比如说程序代码区)就是“非法访问”, 如果指向正常变量可能导致意外的修改或者取到意外的值。你的第一个get函数返回了一个指向局部变量的地址(数组名是常量指针),是常见的错误。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-22
a[]的作用域在char()函数内,因此char()函数返回后a[]数组已不存在,返回的地址已不是有效的地址。
相似回答