2014-02-27 60 views
2

我的作業分配在下面引用。萬一我誤讀了一些東西。從一個函數返回一個數組地址到一個指針(C++)

「在一個稱爲PointerPractice.cpp文件,寫入一個稱爲concatArrays函數,接受兩個int陣列 作爲參數和兩個陣列連接成三分之一較大的陣列,該函數創建。 該函數應僅使用指針算術(無數組符號),並應返回一個指針 新創建的數組的函數應具有以下原型:。 INT * concatArray(INT * pArray1,INT尺寸1,INT * pArray2,INT size2個)

在你的主要功能:

  1. 創建大小爲8的兩個int陣列和10
  2. 使用循環,利用隨機數填充兩個陣列。每個隨機數應該在 範圍0至9(含)。
  3. 使用一些註釋來打印兩個數組,以指示正在打印哪個數組。
  4. 現在使用兩個隨機數組及其大小作爲參數調用concatArray。
  5. 使用指針保存從concatArray返回的數組的引用。
  6. 最後,打印返回數組的一些註釋表明它是從concatArray結果數組 。」

當我從功能本身進行打印,其打印出正確的。當我嘗試打印出主要的,它打印出每個地址,而不是一個單一的數字號碼的隨機字符串從0-9

功能:

int* concatArray(int* pArray1, int size1, int* pArray2, int size2) 
{ 
    int newArray[size1+size2]; 

    for(int i=0; i<size1+size2; i++) 
    { 
     if(i>size1) 
     { 
      *(newArray+i) = *(pArray2+i-size1); 
     } 

     else 
     { 
      *(newArray+i) = *(pArray1+i); 
     } 
    } 

    cout<<endl; 

    for(int i=0; i<size1+size2; i++) 
    { 
     cout << *(newArray+i)<<endl; 
    } 

    return newArray; 

當我在主調用函數:

ptrConcatArray = concatArray(myArray1, size1, myArray2, size2); 

    cout <<endl; 
    cout << "Resultant array:" << endl; 

    for(int i=0; i<size1; i++) 
    { 
     cout << *(ptrConcatArray+i)<<endl; 
    } 
+0

你不能在函數中聲明一個變量,然後通過值將其返回給調用者,但是你可以將它的一個副本或一個地址返回到像堆對象那樣非本地的內存空間。 –

回答

2

你正在返回一個指向本地數組的指針。該函數返回時該數組已被銷燬,使指針懸空(即沒有指向任何有效的指針)。

您應該返回std::vector<int>,這是一個可正確複製的動態數組(與內置數組類型不同),並自動管理陣列的內存。

如果您分配禁止使用標準庫(因爲它似乎當它說:「使用指針」),那麼也許你可以返回一個指向與new分配的數組:

int * newArray = new int[size1+size2]; 

這是一個壞主意,因爲它將責任放置在調用者上,以便在完成時刪除該數組;但可能發生的最糟糕的情況是內存泄漏,而不是內存損壞和未定義的行爲,您將通過返回懸掛指針獲得該行爲。

+0

非常感謝!這就是我認爲我的教授要我做的事。忘了新操作員。 – Kaune

0

int newArray[size1+size2];是局部變量,它不可能是一個返回值。

int newArray = new int[size1+size2];應該沒問題。

+0

感謝您的回答!幫助我找出解決方案。 – Kaune

相關問題