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

正确返回的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果您想将一个函数的返回值类型从其他类型改为char类型,您需要在函数声明和定义中将返回类型改为char。例如: char myFunction() { // function code here } 这将使函数返回一个char类型的值。请注意,如果您的函数原本返回的是其他类型的值,您需要确保将其转换为char类型,否则可能会导致错误或不可预测的行为。 ### 回答2: 将返回类型从原来的数据类型改为char类型可以通过以下步骤实现: 首先,在函数声明和定义中将返回类型从原来的数据类型更改为char。 例如,原来的函数声明和定义可能如下所示: int getFirstLetter(string word){ // 代码实现 // ... return firstLetter; } 更改后的函数声明和定义应如下所示: char getFirstLetter(string word){ // 代码实现 // ... return firstLetter; } 然后,根据函数内部的逻辑和需求,确保返回值为char类型。 在上述示例中,需要确保变量firstLetter的类型为char,并且在返回语句中返回变量。 如有必要,进行必要的代码修改以适应新的返回类型。确保整个函数的语法和逻辑都与char类型返回值相兼容。 最后,根据具体的编程环境和需求进行编译和测试,确保将返回变量改为char类型的修改没有引入新的错误,并且能够正常工作。 这样,函数的返回变量就成功地从原来的数据类型改为char类型了。 ### 回答3: 将返回变量更改为char类型需要进行以下步骤: 首先,在函数的声明和定义处将返回类型从原来的类型更改为char。例如,如果原来返回的类型是int,现在需要更改为char。 接下来,在函数内部,确保函数体中的逻辑和操作返回的是char类型的值。 然后,根据返回的char值的实际含义和用途,可以选择不同的返回方式。如果函数只返回一个字符,可以直接使用char变量存储该字符,并在函数末尾使用return语句返回变量。 如果函数需要返回一个字符串,可以使用char数组或指针来存储字符串,并在函数末尾使用return语句返回该数组或指针。 最后,需要确保函数的调用者能够正确处理和使用返回的char类型值。调用者需要根据返回的char值的含义和用途进行相应的操作和处理。 需要注意的是,返回char类型值的函数在使用时需要注意返回的值是否在合法的char范围内,避免出现不符合预期的结果。 以上为将返回变量更改为char类型的步骤及注意事项,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值