为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
湖上湖 2020-02-03 12:50:19
我试图从函数返回数组:#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但是我听不懂。此外,如果我在全局范围内分配数组,这将变得非常容易,但是如果是这种情况,那么所有内容都应全局声明?我们为什么还要担心从函数传递指针呢?(我的书中有一章用于传递指针)
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

不可否认,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;

}

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


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


查看完整回答
反对 回复 2020-02-03
?
月关宝盒

TA贡献1772条经验 获得超5个赞

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

如注释中所建议,std::array或者std::vector将为您提供复制构造函数,该构造函数将允许您在尝试执行操作时按值返回对象。否则,您将不得不诉诸类似将输出数组作为参数传入的方法。


查看完整回答
反对 回复 2020-02-03
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您将返回一个指向要在return语句处释放的数组的指针。这是一个悬空的指针。是UB。

使用std::vectorstd::array并按值返回。有一些编译器优化可以避免效率低下。


查看完整回答
反对 回复 2020-02-03
  • 3 回答
  • 0 关注
  • 665 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信