为什么我的 I 无法返回数组?
Why my I can't return an array?
我试图从函数返回一个指向数组的指针,但我有一个问题。当我尝试这样输出时:
#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[]
而不是delete
。delete[]
是销毁数组的正确方法。
一个更好的选择
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;
}
相关文章:
- 从 C++ 中的函数返回数组地址问题
- 如何在 c++ 函数中返回数组
- 如何从 c++ 中的函数返回数组
- 为什么 c++ 函数可以正确返回数组的大小?
- 解释通过从函数引用返回数组的语法
- (C++)我的函数不返回数组
- 如何按 C++ 中的值从函数返回数组
- 返回数组中值的指针地址
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 使用数组类返回数组c++
- 如何使函数返回数组?用于制作在VB.NET中使用的DLL
- 从函数 BY VALUE 返回数组,返回结构时会发生什么?
- 调用和打印函数,在 C++ 中返回数组
- 如何使用递归函数返回数组中整数的索引?
- 从函数返回数组时是否需要删除
- 为什么从函数返回数组时需要将数组声明为静态数组.(C++)
- C++返回数组而不进行动态内存分配?
- 在函数 c++ 中返回数组时出现问题
- 如何从C 中的函数返回数组
- 如何使类函数返回数组,然后将其调用并存储在 main 中