返回变量内容的错误示例和正确返回的4种方法

本文介绍了在C++中返回结构体的四种有效方法:通过全局变量、局部静态变量、外部实参修改以及堆区分配内存的方式返回结构体,解决了因栈内存释放导致的数据丢失或段错误问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正确返回的4种方法:

  • 将要返回的变量设置为全局变量,所以退出函数时不会被销毁
  • 返回一个局部静态变量,所以退出函数时不会被销毁
  • 使用实参获取变量内容,因为实参是在函数外创建的,所以退出函数时不会被销毁
  • 使用new申请内存空间,所以退出函数时不会被销毁

示例程序如下所示:

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

//1. 返回(局部)多个数据的引用,数据会出错
//引用数组的返回类型定义 格式: 类型 (&函数名) [数组个数]
typedef int (&pfun2_t) [5];  //不是引用,会报错
pfun2_t getArray() //getArray为函数名,返回类型为int&[5]-引用的数组  不可以返回指向"栈内存"的指针,因为指向空间在函数结束后将会自动释放
{
    int arr[5] = {111,2,3,4,5};
    cout << "int getArray " << endl;
    for(int i = 0; i < 5; i++)
        cout << arr[i] << "\t";
    cout << endl;

    return arr; //返回数组(指向"栈内存"的指针,指向空间在函数结束后将会自动释放)
}

//2.返回局部结构体,会产生段错误
typedef struct student
{
    char name[16];
    int age;
}stu_t;
//----
stu_t& getStudent()
{
    stu_t stu = {"zhangsan",22};
    cout << "in getStudent() : " << stu.name << " " << stu.age << endl;
    return stu; //返回stu结构体
}

//-----------------------------------------------------------------------

//解决办法1:将要返回的变量设置为全局变量,所以退出函数时不会被销毁
stu_t stu1 = {"lisi",22}; //在创建的时候,结构体才能初始化
stu_t& getStudent1()
{
    cout << "in getStudent1() : " << stu1.name << " " << stu1.age << endl;
    return stu1; //返回stu结构体
}

//解决办法2:返回一个局部静态变量,所以退出函数时不会被销毁
stu_t getStudent2()
{
    static stu_t stu2 = {"wangwu",12};
    cout << "in getStudent2() : " << stu2.name << " " << stu2.age << endl;
    return stu2; //返回stu结构体
}

//解决办法3:使用实参获取变量内容,因为实参是在函数外创建的,所以退出函数时不会被销毁
stu_t& getStudent3(stu_t &stu3)
{
    strcpy(stu3.name,"zhaosi");
    stu3.age = 123;
    cout << "in getStudent3() : " << stu3.name << " " << stu3.age << endl;
    return stu3; //返回stu结构体
}

//解决办法4:使用new申请内存空间,所以退出函数时不会被销毁  可以返回指向“堆内存”的指针
stu_t& getStudent4()
{
    stu_t *pstu = new stu_t;
    strcpy(pstu->name,"liuliu");
    pstu->age = 233;
    cout << "in getStudent4() : " << pstu->name << " " << pstu->age << endl;
    return *pstu; //返回stu结构体
}

int main()
{

//1. 返回多个数据的引用,数据会出错
#if 1
    int (&arrref)[5] = getArray();
    cout << "int main fun" << endl;
    for(int i = 0; i < 5; i++)
        cout << arrref[i] << "\t"; //只能正确返回数组第一个数据,其它不会返回
    cout << endl << endl;
#endif

#if 0
//2.返回结构体,会产生段错误
    //stu_t temp = getStudent();  //会产生段错误,因为虽然返回了指针,但是指针所指向的内存上的数据已经被销毁
    //cout << "in main: " << temp.name << " " << temp.age << endl;
#endif

//---------------------------------------------------------------------------
    cout << "--------------" << endl << endl;

    //解决办法1:将要返回的变量设置为全局变量,所以退出函数时不会被销毁
    stu_t temp1 = getStudent1();   //不会发现段错误,因为返回的是全局变量,函数结束该变量不会被销毁
    cout << "in main: " << temp1.name << " " << temp1.age << endl << endl;

    //解决办法2:返回一个局部静态变量,所以退出函数时不会被销毁
    stu_t temp2 = getStudent2();   //不会发现段错误,因为返回的是静态变量,函数结束该变量不会被销毁
    cout << "in main: " << temp2.name << " " << temp2.age << endl << endl;

    //解决办法3:使用实参获取变量内容,因为实参是在函数外创建的,所以退出函数时不会被销毁
    stu_t t_stu;
    stu_t temp3 = getStudent3(t_stu);   //不会发现段错误,t_stu是在函数外创建的,所以退出函数时不会被销毁
    cout << "in main: " << temp3.name << " " << temp3.age << endl << endl;

    //解决办法4:使用new申请内存空间,所以退出函数时不会被销毁
    stu_t temp4 = getStudent4();   //不会发现段错误,因为使用new申请内存空间,所以退出函数时不会被销毁
    cout << "in main: " << temp4.name << " " << temp4.age << endl << endl;
}
 

 

转载于:https://www.cnblogs.com/linuxAndMcu/p/7389961.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值