当前位置:编程学习 > C/C++ >>

C语言--返回局部变量的地址

我们可能会经常写出这样的代码:

int  add(int  a , int  b)

{

 return  a + b;

}

当然,这是合理的写法,使函数的返回值为 int ,所以,调用函数后会返回一个int型的值。

 


今天,我想讨论的问题当然不是这个,请看下面这段代码:

char* Func_1(void)
{
 char str[30] = "Bruce";
 cout<<"str:"<<str<<endl;
 
 return str;     //???????
}


这里有问题吗?不是和上面一样吗?

当然不一样,上面的函数返回的是一个具体值,但是这个函数但会的是一个地址,那么,函数不可以返回地址吗?当然可以,只是,这里不行。

这里的地址是一个局部变量 str 的地址,我们都知道,局部变量是存储在栈里的,当函数执行时,其中的局部变量会执行压栈操作,但是,当函数执行完毕后,栈中的数据会弹出,以便腾出栈空间。

所以,当函数执行完毕后,指针指向的地址当然是存在的,只是它指向的数据已经不在了。

真的是这样吗?

下面给出一个例子:


 
 

#include <iostream>  
#include <string>  
using namespace std; 
 
const char* testValue = "BruceZhang"; 
char gstr[30] = {0}; 
 
char* Func_1(void); 
char* Func_2(void); 
 
int main(void) 
{ 
    char* func_1; 
    char* func_2; 
     
    func_1 = Func_1(); 
    func_2 = Func_2(); 
 
    cout<<"func_1:"<<func_1<<endl; 
    cout<<"func_2:"<<func_2<<endl; 
 
    system("pause"); 
    return 0; 
} 
 
char* Func_1(void) 
{ 
    char str[30] = "Bruce"; 
    cout<<"str:"<<str<<endl; 
     
    return str; 
} 
 
char* Func_2(void) 
{ 
    strcpy(gstr, testValue); 
    cout<<"gstr:"<<gstr<<endl; 
    return gstr; 
} 

#include <iostream>
#include <string>
using namespace std;

const char* testValue = "BruceZhang";
char gstr[30] = {0};

char* Func_1(void);
char* Func_2(void);

int main(void)
{
 char* func_1;
 char* func_2;
 
 func_1 = Func_1();
 func_2 = Func_2();

 cout<<"func_1:"<<func_1<<endl;
 cout<<"func_2:"<<func_2<<endl;

 system("pause");
 return 0;
}

char* Func_1(void)
{
 char str[30] = "Bruce";
 cout<<"str:"<<str<<endl;
 
 return str;
}

char* Func_2(void)
{
 strcpy(gstr, testValue);
 cout<<"gstr:"<<gstr<<endl;
 return gstr;
}

下面的截图是在我的电脑上运行的结果:

 


由此可以看出,应该显示“Bruce”的地方,显示的是不能识别的乱码,由此,验证了上面的说法。

所以,我们在编写程序的时候需要注意,返回值如果是值,可以大胆的操作,但是,如如果返回的是地址,那么我们就需要考虑是不是局部自动变量的问题了。

 

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,