函数返回值问题代码测试
2017-08-13 14:57
190 查看
总结:就看返回的是什么?
1,如果是值(int ,char,double,string):没有问题,因为在函数中会拷贝一个临时的值返回当做返回值。
2. 如果是地址(*/&):注意看是局部变量的地址还是字符常量的地址,
如果是栈上分配的局部变量的地址,自然在return的是已经释放了空间,在主函数中调用,肯定有问题。
如果是字符常量的地址,因为字符常量存储在只读数据段,所以不会释放掉,可以读取。
代码验证:
1,如果是值(int ,char,double,string):没有问题,因为在函数中会拷贝一个临时的值返回当做返回值。
2. 如果是地址(*/&):注意看是局部变量的地址还是字符常量的地址,
如果是栈上分配的局部变量的地址,自然在return的是已经释放了空间,在主函数中调用,肯定有问题。
如果是字符常量的地址,因为字符常量存储在只读数据段,所以不会释放掉,可以读取。
代码验证:
#include <iostream> #include <string> using namespace std; // //int& back(int &a) //{ // int temp = a; // return temp; //警告 1 warning C4172: 返回局部变量或临时变量的地址 // //} //string back(string &b) //{ // string temp = b; // return temp; //} //string &f() //警告 1 warning C4172: 返回局部变量或临时变量的地址 //{ // string a = "hello"; // return a; //} //string f() //{ // string a = "hello"; // return a; //} // //int fun1() //{ // int temp = 10; // return temp; //} // //char *fun() //{ // char *p = "hello"; // return p; //} //char* Func() //{ // char p[100] = "hello"; // return p; //警告 1 warning C4172: 返回局部变量或临时变量的地址 //} // // //int *fun2() //{ // int temp = 10; // return &temp; //警告 1 warning C4172: 返回局部变量或临时变量的地址 //} //int &fun3() //{ // int temp = 10; // return temp; //警告 1 warning C4172: 返回局部变量或临时变量的地址 //} //1.正确。最normal的情况。 int returnValue() { int value = 3; return value; } // 2.错误。最normal错误。虽然value被释放,但是它的值不一定会被清除, //所以有时候你这么用看起来结果好像也是对的,但是隐患无穷。 int* returnValue1() { int value = 3; return &value; } //3.正确。不用奇怪,“HelloJacky”是一个字符串常量,储存在只读数据段, //return str只是返回了该字符串在只读数据段所在的首地址, //当函数退出后,该字符串所在的内存不会被回收,所以是正常的。 char* returnValue2() { char* str = "HelloJacky"; return str; } //4.错误。这一回“HelloJacky”是栈内的局部变量, //函数退出时内存被释放,因此返回栈内局部变量的地址是错误的。 char* returnValue3() { char str[] = "HelloJacky"; return str; } //5.正确。如果你非要返回一个局部变量的地址,那么加上static吧。 char* returnValue4() { static char str[] = "HelloJacky"; return str; } //6.错误,一样的,数组也不能作为函数的返回值,因为数组名其实是局部变量的首地址。 int* returnValue5() { int value[3] = { 1, 2, 3 }; return value; } int main() { cout << returnValue1() << endl; int a = 10; //int IntBackValue = back(a); //cout << IntBackValue << endl; //string b = "ak"; //string StringValue = back(b); //cout << StringValue << endl; //char *s; //s = fun(); //cout << s << endl; //char *sf; //sf = Func(); //cout << sf << endl; //int s1; //s1 = fun1(); //int *s2; //s2 = fun2(); // //int s3; //s3 = fun3(); system("pause"); return 0; }
相关文章推荐
- C语言中关于scanf()函数返回值问题
- (2)int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
- SpringMVC 函数返回值问题,返回Json解决方法
- PHP的exec()函数无返回值排查方法------借鉴本文方法后派上了用场,解决了问题
- js中一个函数获取另一个函数返回值问题
- 代码测试----不定参函数
- sqlserver中编写自定义函数中的返回值问题
- php intval的测试代码发现问题
- 浅谈C++中内存分配、函数调用和返回值问题
- ...后台代码中如何调用 javascript 函数的问题! - ASP.NET专题(按钮事件中调用JS文件中函数)
- C++中内存分配、函数调用和返回值问题
- 测试代码问题
- 《零基础入门学习Python》学习过程笔记【019函数返回值问题】
- 解决OneThink中模型中字段参数为函数时无返回值的问题
- C++中用函数返回值初始类对象时的一个问题
- 关于函数返回值为引用和指针的问题
- 毕业设计之带有ajax的function()函数返回值问题
- JS代码获取当前日期时支持IE,不兼容FF和chrome,解决这个问题,我们需要把获取时间的getYear()函数换成getFullYear()
- 函数返回值问题
- 关于linux shell函数返回值问题