我正在尝试从函数返回一个数组:
#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
当我尝试在c[10]
函数中打印uni()
的值时,它会打印正确的值。为什么会这样?
这是与堆栈有关的吗?因为我已经尝试搜索我的这个错误,我在stackoverflow上发现了一些地方,它说do not allocate on stack
但我无法理解它。
此外,如果我全局分配我的数组会变得非常容易,但如果是这种情况那么一切都应该全局声明?为什么我们甚至担心从函数传递指针? (我的书中有一章用于传递指针)
答案 0 :(得分:5)
您正在返回指向本地对象的指针。在uni
函数中,变量c
在堆栈上分配。在该函数结束时,所有内存都被释放,并且在for
循环中,您将得到未定义的结果。
正如评论中所建议的那样,std::array
或std::vector
会为您提供复制构造函数,以便您在尝试时按值返回对象。否则,你将不得不求助于将输出数组作为参数传递。
答案 1 :(得分:4)
不可否认,std::vector
或std::array
方法将是您的选择。
然而,只是为了解决问题(如果这是一个学校项目,老师给你强制性的“你不能使用STL”),另一个避免指针使用的替代方案是将数组包装在里面一个struct并返回struct的实例。
#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;
}
请注意,struct按值返回,此返回值在main
中分配。
您具有返回实例的值语义,并且将复制结构,包括其中的内部数组。