关于局部变量的有关问题求解答

关于局部变量的问题求解答~
突然在看程序时对局部变量有所疑问了:


第一个程序如此:

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