概述
正确返回的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
最后
以上就是英俊手套为你收集整理的返回变量内容的错误示例和正确返回的4种方法的全部内容,希望文章能够帮你解决返回变量内容的错误示例和正确返回的4种方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复