返回局部变量的地址

我们可能会经常写出这样的代码:
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);  
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;  
} 

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;  
} 


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

由此可以看出,应该显示“Bruce”的地方,显示的是不能识别的乱码,由此,验证了上面的说法。
所以,我们在编写程序的时候需要注意,返回值如果是值,可以大胆的操作,但是,如如果返回的是地址,那么我们就需要考虑是不是局部自动变量的问题了。


装载自:http://blog.youkuaiyun.com/dlutbrucezhang/article/details/9528885

 

在编程中,避免返回局部变量地址是一个重要的编程实践。局部变量是在函数或方法内部定义的变量,它们在函数调用期间存在,函数执行完毕后,这些变量就会被销毁。如果返回局部变量地址,可能会导致未定义行为或程序崩溃。以下是一些关键点: 1. **生命周期**:局部变量的生命周期仅限于函数或方法执行期间。一旦函数执行完毕,局部变量就会被销毁,指针指向的内存地址可能不再有效。 2. **未定义行为**:返回局部变量地址可能导致未定义行为。未定义行为是指程序的行为不可预测,可能导致程序崩溃、数据损坏或其他不可预测的问题。 3. **内存管理**:如果返回局部变量地址,调用者可能会尝试访问已经释放的内存,这会导致内存访问错误。 4. **解决方案**:为了避免这些问题,可以使用动态内存分配(如`malloc`或`new`)或返回指向静态变量、全局变量或通过引用传递的参数。 以下是一个示例,展示了如何避免返回局部变量地址: ```cpp #include <iostream> int* getLocalVariableAddress() { int localVar = 10; // 局部变量 return &localVar; // 返回局部变量地址 } int* getStaticVariableAddress() { static int staticVar = 10; // 静态变量 return &staticVar; // 返回静态变量的地址 } int main() { int* ptr1 = getLocalVariableAddress(); std::cout << "Local Variable Address: " << ptr1 << std::endl; // 未定义行为 std::cout << "Local Variable Value: " << *ptr1 << std::endl; // 未定义行为 int* ptr2 = getStaticVariableAddress(); std::cout << "Static Variable Address: " << ptr2 << std::endl; std::cout << "Static Variable Value: " << *ptr2 << std::endl; return 0; } ``` 在这个示例中,`getLocalVariableAddress`函数返回局部变量地址,这会导致未定义行为。而`getStaticVariableAddress`函数返回了静态变量的地址,这是安全的,因为静态变量在程序的生命周期内保持有效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值