标签:ref tle span ++ csdn 方法 错误 函数定义 copy
---恢复内容开始---
调用某个函数时经常需要函数返回一个值,我们都知道c++ 的函数返回的是一个copy,所以当只返回一个值时不会出现什么问题,直接return一个copy就行了,但是如果返回一个数组,事情就变得有趣了,我最近就遇到了这个问题。
先附上代码吧:
#include<iostream>
using namespace std;
//函数声明
int * fun1();
int * fun2();
void dispArr(int *arr ,int n);
const int arrlen = 10;
int main()
{
//方法一,返回局部变量的首地址
int * arr;
arr = fun1();
cout << "这是方法一" << endl;
dispArr(arr, arrlen);
//cout << fun1()[1] << endl;//我们可以通过这样的方式将数组未被销毁的内容输出,但这样做没有意义
/*方法二,在函数内部通过new动态创建数组,
然后记得在main函数使用完数组后将其delete下*/
cout << "这是方法二" << endl;
int *arr1;
arr1 = fun2();
dispArr(arr1, arrlen);
delete arr1;
return 0;
}
//函数定义
int *fun1()
{
int temp[arrlen];
for (int i = 0; i < arrlen;++i)
{
temp[i] = i;
}
return temp;
}
int *fun2()
{
int *temp = new int[arrlen];
for (int i = 0; i < arrlen; i++)
{
temp[i] = i;
}
return temp;
}
void dispArr(int* arr, int n)
{
for (int i = 0; i < n; i++)
{
cout << "arr" << "[" << i << "]" << " is:" <<arr[i]<<endl;
}
}
这是运行结果
问题很简单啦,就是通过一个函数创建一个数组,然后将数组返回,并将数组里的内容打印到屏幕上。拿到这个问题,像我这样初学者首先建立的思路是,你不是要我返回一个数组吗,我就返回一个数组的首地址给你啊,然后你根据这个地址去寻址,不就可以了吗。一开始我也这么想,因为我在java里就是这么干,所以很自然就想到了,然而是错的,而且是范了很傻的错误,因为c++里的指针可不是java里的引用,c++里也没有GC(Garbage Collection),关于内存的事还得靠你自己,你自己。
错误原因:函数体内部创建的变量都是局部变量,当函数运行结束的时候,都会抛弃,也就是说你只返回了一个temp指针,这个指针确实是你想要的,这没有问题,但是它指向的内容在函数结束也就是return的那一刻之后就已经物是人非了。所以你用这个这个指针去访问的内容也不是你想要的内容了。
解决方法:动态内存分配,就是new和delete的配合使用。在函数里用new关键字创建一个数组,这样这块地址对应的内容就属于你管理了,再也不会在函数结束的时候被回收了,你也就可以通过返回的指针来访问数组了,最后再delete一下。
千万不要返回一个局部变量的指针或引用,因为你返回也是没用的,得到的指针所指内容在函数结束后就已经变了。
关于c++函数返回值和参数调用想了解更多,可以点 这里 。
---恢复内容结束---
标签:ref tle span ++ csdn 方法 错误 函数定义 copy
原文地址:http://www.cnblogs.com/walter-xh/p/6192800.html