数组未正确返回

时间:2010-04-15 15:36:42

标签: c++ arrays

我正在尝试返回一个简单的数组,但是我没有得到正确的结果。 我得到以下

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;

}

9 个答案:

答案 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::vectorstd::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作为参数传递给函数会更好,因此可以在同一个抽象级别为它分配和释放内存。