为什么我的 I 无法返回数组?

Why my I can't return an array?

本文关键字:返回 数组 我的 为什么      更新时间:2023-10-16

我试图从函数返回一个指向数组的指针,但我有一个问题。当我尝试这样输出时:

#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;
}

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

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

您定义了一个堆栈分配的数组r,它在退出函数Soma_Array时被销毁。这是向量比普通数组更受欢迎的原因之一——它们为你处理分配和回收。

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

以下内容:

int r[size*2];

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

您可以通过以下操作来修复此问题:

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

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

IMPORTANT通过这样做,您现在必须在完成r时手动释放它。例如,你的调用代码看起来像这样:

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

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

一个更好的选择

std::vector是否更符合你的要求?这是一种比手工制作的数组更安全的选择。vector使用起来更安全,在添加元素时自动缩放,并在离开作用域时很好地清理自己(假设您使用的是值类型实例)。此外,向量可以很容易地复制和移出函数。

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;
}