您的位置:首页 > 编程语言

函数返回值问题代码测试

2017-08-13 14:57 190 查看
总结:就看返回的是什么?

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  局部变量
相关文章推荐