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

cod*_*027 1 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;
}
Run Code Online (Sandbox Code Playgroud)

我从main()我的uni()函数传递两个数组.在那里,我创建了一个新的数组c[10],我回到了我的main().在我的uni()功能,我尝试在两个数组合并非负数ab.

但我得到这样的东西作为我的输出.

1 -1078199700 134514080 -1078199656 -1216637148 134519488 134519297 134519488 8 -1078199700 
Run Code Online (Sandbox Code Playgroud)

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

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

Pau*_*zie 6

不可否认,std::vectoror std::array方法是必经之路。

但是,只是为了解决问题(如果这是一个学校项目,如果老师给您强制性的“您不能使用STL”),另一种避免使用指针的方法是将数组包装在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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,该结构按值返回,并且此返回值在中分配main

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

现场例子


Jay*_*ler 5

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

正如评论中所建议的那样,std::array或者std::vector会给你复制构造函数,允许你按照你想要的那样按值返回对象.否则你将不得不求助于将输出数组作为参数传递.