猿问

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

我试图从函数返回数组:


#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但是我听不懂。


此外,如果我在全局范围内分配数组,这将变得非常容易,但是如果是这种情况,那么所有内容都应全局声明?我们为什么还要担心从函数传递指针呢?(我的书中有一章用于传递指针)


湖上湖
浏览 666回答 3
3回答

冉冉说

不可否认,std::vectoror std::array方法是必经之路。但是,只是为了解决问题(如果这是一个学校项目,如果老师给您强制性的“您不能使用STL”),则可以避免使用指针的另一种方法是将数组包装在struct和返回该结构的实例。#include <iostream>using namespace std;struct myArray{&nbsp; &nbsp;int array[10];};myArray uni(int *a,int *b){&nbsp; &nbsp; myArray c;&nbsp; &nbsp; int i=0;&nbsp; &nbsp; while(a[i]!=-1)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; c.array[i]=a[i];&nbsp; &nbsp; &nbsp; &nbsp; i++;&nbsp; &nbsp; }&nbsp; &nbsp; for(;i<10;i++)&nbsp; &nbsp; &nbsp; &nbsp; c.array[i]=b[i-5];&nbsp; &nbsp; return c;}int main(){&nbsp; &nbsp; int a[10]={1,3,3,8,4,-1,-1,-1,-1,-1};&nbsp; &nbsp; int b[5]={1,3,4,3,0};&nbsp; &nbsp; myArray c = uni(a,b);&nbsp; &nbsp; for(int i=0;i<10;i++)&nbsp; &nbsp; &nbsp; &nbsp; cout << c.array[i] << " ";&nbsp; &nbsp; cout << "\n";&nbsp; &nbsp; return 0;}注意,该结构按值返回,并且此返回值在中分配main。您具有返回实例的值语义,此外还将复制该结构,包括其中的内部数组。

月关宝盒

您正在返回一个指向本地对象的指针。在uni函数中,变量c分配在堆栈上。在该函数结束时,将释放所有内存,并且在for循环中您将获得未定义的结果。如注释中所建议,std::array或者std::vector将为您提供复制构造函数,该构造函数将允许您在尝试执行操作时按值返回对象。否则,您将不得不诉诸类似将输出数组作为参数传入的方法。

明月笑刀无情

您将返回一个指向要在return语句处释放的数组的指针。这是一个悬空的指针。是UB。使用std::vector或std::array并按值返回。有一些编译器优化可以避免效率低下。
随时随地看视频慕课网APP
我要回答