如何从C++函数返回本地数组
在这里,我们将构建一个C++程序,以从函数返回本地数组。并将使用三种方法正确方式返回数组的方法,即:
- 使用 动态分配的数组
- 使用 静态数组
- 使用 结构
// C++从函数返回本地数组的程序,其中违反了一些规则 include <iostream> using namespace std;
int* fun() { int arr [100];
//对arr[]进行一些操作 arr[0]=10; arr[1]=20; 返回arr;}
int main() { int *ptr=fun ();
cout<<ptr[0] <<" "<<ptr[1]
; 返回0;}
警告:
在函数'int *fun()'中:
6:8:警告:返回本地变量'arr'的地址[-Wreturn-local-addr]
上面的程序是 错误的 。它可能产生10或20的值作为输出,也可能产生垃圾值或会崩溃。问题在于,我们返回一个本地变量的地址,这是不被建议的,因为本地变量在函数调用结束后可能不存在于内存中。
以下是一些返回数组的正确方法
1.使用动态分配的数组
动态分配的内存(使用new或malloc()分配)保留到我们使用delete或free()删除为止。因此我们可以创建一个动态分配的数组,并在函数退出时删除它。
示例:
// C++在函数中演示从动态分配数组返回本地数组 # include <iostream> using namespace std;
int* fun() { int* arr=new int[100];
//对arr[]进行一些操作 arr[0]=10; arr [1]=20;
返回arr;
}
int main() { int *ptr=fun ();
cout<<ptr[0] <<" "<<ptr[1];
//分配的内存必须删除 delete[] ptr;
返回 0;}
输出
10 20
2.使用静态数组
静态变量的生命周期是整个程序。因此我们始终可以创建一个本地静态数组并返回它。
示例:
//C++演示从静态数组中的函数返回本地数组 # include <iostream> using namespace std;
int* fun() { static int arr[100];
//对arr[]进行一些操作 arr[0]=10; arr[1]=20;
返回arr;
}
int main() { int *ptr=fun ();
cout<<ptr[0] <<" "<<ptr[1];
返回 0;}
输出
10 20
3.使用结构
我们可以将数组包装在结构/类中并返回结构/类的实例。这项工作的原因是,结构体/类的成员数组是深度复制的。在下面的程序中,当我们返回的实例在main中被复制时,就会发生深层复制。
示例:
// C++程序:演示从函数中使用Struct返回本地数组
#include <iostream>
using namespace std;
struct arrWrap {
int arr[100];
};
struct arrWrap fun()
{
struct arrWrap x;
x.arr[0] = 10;
x.arr[1] = 20;
return x;
}
int main()
{
struct arrWrap x = fun();
cout << x.arr[0] << " " << x.arr[1];
return 0;
}
输出
10 20