从c ++中的函数返回数组

时间:2014-12-10 21:15:38

标签: c++ arrays pointers

我正在尝试从函数返回一个数组:

#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()函数中,我尝试合并两个数组ab中的非负数。

但我得到的是这样的输出。

1 -1078199700 134514080 -1078199656 -1216637148 134519488 134519297 134519488 8 -1078199700 

当我尝试在c[10]函数中打印uni()的值时,它会打印正确的值。为什么会这样? 这是与堆栈有关的吗?因为我已经尝试搜索我的这个错误,我在stackoverflow上发现了一些地方,它说do not allocate on stack但我无法理解它。

此外,如果我全局分配我的数组会变得非常容易,但如果是这种情况那么一切都应该全局声明?为什么我们甚至担心从函数传递指针? (我的书中有一章用于传递指针)

2 个答案:

答案 0 :(得分:5)

您正在返回指向本地对象的指针。在uni函数中,变量c在堆栈上分配。在该函数结束时,所有内存都被释放,并且在for循环中,您将得到未定义的结果。

正如评论中所建议的那样,std::arraystd::vector会为您提供复制构造函数,以便您在尝试时按值返回对象。否则,你将不得不求助于将输出数组作为参数传递。

答案 1 :(得分:4)

不可否认,std::vectorstd::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中分配。

您具有返回实例的值语义,并且将复制结构,包括其中的内部数组。

Live Example