zoukankan      html  css  js  c++  java
  • 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;
    }


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


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

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

  • 相关阅读:
    ansible become与sudo
    GTID 复制、主从不一致跳过操作、快速切换master
    percona toolkit 更新至一致性检查
    oracle ldap (ODEE ODCC)复制概要
    zabbix api 批量添加主机(python3 requests)
    grafana 5.0+ templating变化
    redis sentinel 客户端
    centos7 变更默认mariadb 记录
    python3 float 计算
    企业微信开发记录
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3221781.html
Copyright © 2011-2022 走看看