2012-05-30 161 views
1

我需要我的函數來返回一個數組,但它並不像大多數搜索示例所顯示的那樣將一個數組作爲參數。C++函數返回數組

的代碼是這樣的:

double myfunction() 
{ 
    double arr[10]; 
    //assign values to the array 
    return arr; 
} 

main() 
{ 
    double arr2[10]; 
    arr2[10] = myfunction; 
    //print arr2 
} 

當我用指針來顯示陣列,我值分別爲「CCCCCC」 ......

+1

數組不能這樣工作。使用'std :: array'或'std :: vector'會給你這樣的行爲,但要確保你知道原始數組的工作方式。看到這個問題:http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c – chris

+0

這甚至不應該編譯,一個'double [10]'不能隱式轉換爲' double(*)()'不能隱式轉換爲'double'(這是一個超出邊界的訪問btw)。請顯示真實的代碼。 – Xeo

回答

6

你不能這樣做...陣列是內存塊,因此不能被「返回」......你可以通過函數調用向數組傳遞指針,但是你不能安全地返回指向數組內存塊的指針,除非這些數組聲明爲static。否則,你會得到未定義的結果,因爲當函數返回時,數組佔用的堆棧上的內存將被回收,並且返回到堆棧內存位置的指針將無效。使用返回的指針很可能會損壞堆棧,或者導致程序崩潰。

在C語言中,爲了避免這個問題,你必須明確地使用指向堆分配數組的指針,但對於固定大小的數組,使用C++最好使用std::vectorstd::array。例如,std::vector仍然使用堆內存來存儲數組(而不是堆棧),但通過RAII堆對象的生命週期安全地管理堆內存。因此,與C不同,您不必擔心內存泄漏無法釋放由指向堆內存的函數返回的指針所指向的內存。

+0

你可以返回一個指向新堆分配數組的指針...... –

+1

是的,但正如我在我的答案中指出的那樣,如果存在有關指針所有權的問題並且未能調用「delete」在指針上「擁有」內存。 – Jason

+0

我認爲如果適用,'std :: array'會更好。它看起來像一個固定大小的數組,而不是數百萬個元素。 – chris

1

注意:main必須結果類型int,由C和C++標準。

使用const幾乎可以使用const也是一個好主意,因爲它增加了代碼的約束,使代碼更容易理解(更少考慮)。

最後,也是最重要的,使用標準庫設施。

#include <array> 
using namespace std; 

typedef array<double, 10> MyArray; 

MyArray myfunction() 
{ 
    MyArray arr; 
    //assign values to the array 
    return arr; 
} 

int main() 
{ 
    MyArray const arr = myfunction(); 
    //print arr2 
}