我正在尝试返回一个简单的数组,但是我没有得到正确的结果。 我得到以下
arr1[0] = 1
arr1[1] = 32767
结果,而结果应该是
arr1[0] = 1
arr1[1] = 15
请建议。
int *sum(int a, int b){
int arr[2];
int *a1;
int result = a+b;
arr[0]= 1;
arr[1]= result;
a1 = arr;
return a1;
}
int main(){
int *arr1 = sum(5,10);
cout<<"arr1[0] = "<<arr1[0]<<endl;
cout<<"arr1[1] = "<<arr1[1]<<endl;
return 0;
}
答案 0 :(得分:16)
您无法返回数组。你要返回的只是一个指向本地对象的指针,当函数返回时,它会在超出范围时被销毁。
您可以传入指向数组的指针,因此该函数会修改数组。
此外,如果数组包含在结构/类中,例如std::tr1::array
(或boost::array
),则可以返回该数组的副本。
答案 1 :(得分:7)
试试这个......
#include <vector>
#include <iostream>
std::vector<int> sum(int a, int b)
{
std::vector<int> rv(2);
rv[0]= 1;
rv[1]= a+b;
return rv;
}
int main()
{
std::vector<int> arr1 = sum(5,10);
std::cout << "arr1[0] = " << arr1[0] << std::endl;
std::cout << "arr1[1] = " << arr1[1] << std::endl;
return 0;
}
答案 2 :(得分:5)
a1
是一个局部变量,在堆栈上分配内存。如果要返回int *
,则应在堆上分配内存。
int *arr = (int *)malloc(sizeof(int) * 2));
//CAUTION you need to de-allocate memory [read about free()]
解释:
只要函数
arr
未完成,请参见int *sum(int, int)
实际上是一个数组。 那么,你返回的实际上是arr
实际上是的地址,并且不再存在。当您尝试访问
main()
中的 内存位置时,您只会获得垃圾/随机值。
答案 3 :(得分:5)
您正在返回指向局部变量的指针 - 当sum()
返回main()
时,阵列不再存在。
除非你包装它们,否则你甚至不能按值返回数组,但你只需返回一个标准容器,如std::vector
或std::pair
:
std::pair<int,int> f(int a, int b) {
return std::make_pair(1, a+b);
}
int main() {
std::pair<int,int> res = f(5,10);
std::cout << res.first << ", " << res.second << std::endl;
}
答案 4 :(得分:1)
这是非常错误的。 int arr[2];
是局部变量,位于堆栈框架中。你不能从函数返回指向堆栈的指针。他们变得无效。
答案 5 :(得分:1)
嗯..好吧,arr是一个堆栈变量,你正在返回一个指向它的指针并期望它仍然有效。
答案 6 :(得分:0)
将指针返回到本地定义的数组是错误的。 a1
放在堆栈上,当函数返回时会被清除。因此,您不再被允许访问该内存。
要“返回一个数组”,您可以使用new
动态分配它,然后返回它。请记住,这将迫使您以后释放它,因此您必须仔细设计该阵列的内存管理策略。
答案 7 :(得分:0)
arr
在堆栈中 - 一旦您从sum()
返回,它就不再存在了。指向它的指针可能会返回随机数据,这是您在返回a1
时看到的内容。
答案 8 :(得分:0)
您应首先为arr分配内存,因此它不是堆栈变量。那么你职能之外的人应该释放它。将arr作为参数传递给函数会更好,因此可以在同一个抽象级别为它分配和释放内存。