亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從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 關注
  • 708 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號