关于局部变量的有关问题求解答
关于局部变量的问题求解答~
突然在看程序时对局部变量有所疑问了:
第一个程序如此:
char translate(int type)
{
char u8Data;
switch(type)
{
case 1:
u8Data='a';
break;
case 2:
u8Data='b';
break;
default:
u8Data='x'
}//end switch
return u8Data;
}//end translate
int main(int argc,char* argv[])
{
char buffer[4]={};
buffer[0]=translate(1);
buffer[1]=translate(2);
buffer[2]=translate(4);
buffer[3]=translate(6);
for(int i=0;i<4;i++)
cout<<buffer[i]<<" ";
cout<<endl;
}
这个可以正常输出 a b x x;
而第二个
char* test_variable_utility()
{
char a[4]={};
a[0]='c';
a[1]='f';
a[2]='a';
a[3]='v';
return a;
}//end
int main(int argc,char* argv[])
{
char* b;
b=new char[4];
b=test_variable_utility();
int i;
for(i=0;i<4;i++)
cout<<b[i]<<" ";
cout<<endl;
}
第二个程序则显示错误;
不都是返回局部变量吗?为什么第一个可以正常返回,而第二个不行呢?
是不是因为第一个虽然是局部变量但返回的是所对应的值,所以不会消失?
而第二个是指针,而返回后数组析构后,指针在第二个之后开始就丢失了吗?
------解决方案--------------------
b=new char[4];
b=test_variable_utility();
b一开始分配的内存泄露了
函数过后指向的是另一个函数栈上的局部变量,因为是栈上分配的,所以出去后销毁了,是一个野指针
------解决方案--------------------
下面这个应该对你理解有点帮助:
突然在看程序时对局部变量有所疑问了:
第一个程序如此:
char translate(int type)
{
char u8Data;
switch(type)
{
case 1:
u8Data='a';
break;
case 2:
u8Data='b';
break;
default:
u8Data='x'
}//end switch
return u8Data;
}//end translate
int main(int argc,char* argv[])
{
char buffer[4]={};
buffer[0]=translate(1);
buffer[1]=translate(2);
buffer[2]=translate(4);
buffer[3]=translate(6);
for(int i=0;i<4;i++)
cout<<buffer[i]<<" ";
cout<<endl;
}
这个可以正常输出 a b x x;
而第二个
char* test_variable_utility()
{
char a[4]={};
a[0]='c';
a[1]='f';
a[2]='a';
a[3]='v';
return a;
}//end
int main(int argc,char* argv[])
{
char* b;
b=new char[4];
b=test_variable_utility();
int i;
for(i=0;i<4;i++)
cout<<b[i]<<" ";
cout<<endl;
}
第二个程序则显示错误;
不都是返回局部变量吗?为什么第一个可以正常返回,而第二个不行呢?
是不是因为第一个虽然是局部变量但返回的是所对应的值,所以不会消失?
而第二个是指针,而返回后数组析构后,指针在第二个之后开始就丢失了吗?
------解决方案--------------------
b=new char[4];
b=test_variable_utility();
b一开始分配的内存泄露了
函数过后指向的是另一个函数栈上的局部变量,因为是栈上分配的,所以出去后销毁了,是一个野指针
------解决方案--------------------
下面这个应该对你理解有点帮助:
- C/C++ code
#include <iostream> using namespace std; char* test_variable_utility() { char a[4]={0}; a[0]='c'; a[1]='f'; a[2]='a'; a[3]='v'; return a; }//end int main(int argc,char* argv[]) { int i; char* b=test_variable_utility(); cout<<"刚调用完test_variable_utility的瞬间:"<<b[0]<<endl; cout<<b[0]<<endl; cout<<b[0]<<endl; cout<<b[0]<<endl; b=test_variable_utility(); cout<<"刚调用完test_variable_utility的瞬间:"<<b[1]<<endl; cout<<b[1]<<endl; cout<<b[1]<<endl; cout<<b[1]<<endl; b=test_variable_utility(); cout<<"刚调用完test_variable_utility的瞬间:"<<b[2]<<endl; cout<<b[2]<<endl; cout<<b[2]<<endl; cout<<b[2]<<endl; b=test_variable_utility(); cout<<"刚调用完test_variable_utility的瞬间:"<<b[3]<<endl; cout<<b[3]<<endl; cout<<b[3]<<endl; cout<<b[3]<<endl; return 0; }
------解决方案--------------------
第二个函数有问题:
如下:
char* test_variable_utility()
{
char a[4]={};
a[0]='c';
a[1]='f';
a[2]='a';
a[3]='v';
return a;
}//end
a[4]是局部数组,只在test_variable_utility中存在,在函数退出时,系统收回栈的资源,a[4]的作用域
失效,代码如下修改:
char a[4]={};char* test_variable_utility()
{
a[0]='c';
a[1]='f';
a[2]='a';
a[3]='v';
return a;
}//end
或:
char* test_variable_utility()
{
static char a[4]={};a[0]='c';
a[1]='f';
a[2]='a';
a[3]='v';
return a;
}//end