为什么我不能返回阵列?

时间:2014-03-14 19:14:29

标签: c++ arrays function pointers

我正在尝试从函数返回指向数组的指针,但我遇到了问题。当我尝试这样输出时:

#include <iostream>

using namespace std;

int* Somma_Array(int[],int[],int);

int main()
{
    int n;
    cin>>n;
    int A[n],B[n];
    for(int i=0;i<n;i++)cin>>A[i];
    for(int i=0;i<n;i++)cin>>B[i];
    int *c=Somma_Array(A,B,n);
    for(int i=0;i<n*2;i++)cout<<c[i];
}

int* Somma_Array(int v[],int p[],int size)
{
    int r[size*2];
    for(int i=0;i<size;i++)r[i]=v[i];
    for(int i=0;i<size;i++)r[i+size]=p[i];
    return r;
}

它打印奇怪的数字而不是实际的数字。我试着做this问题所说的但是它不起作用。它给了我以下警告:

[Warning] address of local variable 'r' returned [enabled by default] 

我正在使用流血的dev-c ++。

3 个答案:

答案 0 :(得分:3)

定义一个堆栈已分配的数组r,当您退出函数Soma_Array时会将其销毁。这是(许多)原​​因之一,向量优先于普通数组 - 它们为您处理分配和释放。

#include <vector>

std::vector<int> getArray() 
{
    std::vector<int> a = {1, 2, 3};
    return a;
}

答案 1 :(得分:3)

以下内容:

int r[size*2];

在本地定义r。当函数退出时(如函数的范围到期),r将被销毁,因为它绑定到函数的作用域。您可能会看到堆栈帧中的垃圾数据。

您可以通过执行以下操作来解决此问题:

int* r = new int[size * 2];

变量r现在将被堆分配并存在于函数范围之外。

重要:完成此操作后,您现在必须在完成后手动释放r。例如,您的调用代码将如下所示:

int* result = Somma_Array(v, p, size);
/* ... do stuff ... */
delete[] result;

由于r是一个数组,请注意使用delete[]代替deletedelete[]是销毁数组的正确方法。

更好的选择

std::vector会更像你追求的吗?这是手动排列的更安全的替代方案。向量使用起来更安全,在添加元素时自动缩放,并在离开作用域时自行清理(假设您使用的是值类型实例)。此外,可以轻松复制矢量并将其移出功能。

答案 2 :(得分:1)

您无法在C ++中返回数组。特别是,您不应该返回指向本地数组的指针。但是,您可以返回std::vector<int>

std::vector<int> Somma_Array(int v[], int p[], int size)
{
    std::vector<int> r(2 * size);
    std::copy(v, v + size, r.begin());
    std::copy(p, p + size, r.begin() + size);
    return r;
}