我正在尝试从函数返回一个数组:
#include <iostream>
using namespace std;
int* uni(int *a,int *b)
{
int c[10];
int i=0;
while(a[i]!=-1)
{
c[i]=a[i];
i++;
}
for(;i<10;i++)
c[i]=b[i-5];
return c;
}
int main()
{
int a[10]={1,3,3,8,4,-1,-1,-1,-1,-1};
int b[5]={1,3,4,3,0};
int *c=uni(a,b);
for(int i=0;i<10;i++)
cout<<c[i]<<" ";
cout<<"\n";
return 0;
}
我将 main()
中的两个数组传递到 uni()
函数中。我在那里创建了一个新数组 c[10]
,我将其返回到我的 main()
。
在我的 uni()
函数中,我尝试合并两个数组 a
和 b
中的非负数。
但我的输出是这样的。
1 -1078199700 134514080 -1078199656 -1216637148 134519488 134519297 134519488 8 -1078199700
而当我尝试在 uni()
函数中打印 c[10]
的值时,它会打印出正确的值。为什么会这样??
这与堆栈有关吗?因为我已经尝试搜索我的这个错误,我在 stackoverflow 上找到了几个地方,上面写着 do not allocate on stack
但我无法理解。
此外,如果我在全局范围内分配我的数组会变得非常容易,但如果是这种情况,那么所有内容都应在全局范围内声明??为什么我们甚至担心从函数传递指针? (我书里有一章是传授指点的)
最佳答案
诚然,std::vector
或 std::array
方法将是可行的方法。
然而,为了解决问题(如果这是一个学校项目,老师给你强制性的“你不能使用 STL”),另一种避免使用指针的方法是将数组包装在里面一个结构并返回该结构的实例。
#include <iostream>
using namespace std;
struct myArray
{
int array[10];
};
myArray uni(int *a,int *b)
{
myArray c;
int i=0;
while(a[i]!=-1)
{
c.array[i]=a[i];
i++;
}
for(;i<10;i++)
c.array[i]=b[i-5];
return c;
}
int main()
{
int a[10]={1,3,3,8,4,-1,-1,-1,-1,-1};
int b[5]={1,3,4,3,0};
myArray c = uni(a,b);
for(int i=0;i<10;i++)
cout << c.array[i] << " ";
cout << "\n";
return 0;
}
注意结构是按值返回的,这个返回值是在main
中赋值的。
你有返回一个实例的值语义,加上结构将被复制,包括它内部的数组。
关于c++ - 从 C++ 中的函数返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27410943/