2014-03-05 60 views
0

我是一個新手,C++後,我寫程序來測試如何通過數組作爲函數的參數,我寫了這個小程序:C++:數組的大小已更改傳遞給函數


#include <iostream> 
using namespace std; 

void pass_by_array(int a[]) { 
int a_len = sizeof(a); 
int e_len = sizeof(a[0]); 

cout << "size of array in func: " << a_len << endl; 
cout << "size of element in func: " << e_len << endl; 
} 

int main() { 
int foo[] = {1, 8, 2, 7, 3, 6}; 

int a_len = sizeof(foo); 
int e_len = sizeof(foo[0]); 

cout << "size of array in main: " << a_len << endl; 
cout << "size of element in main: " << e_len << endl; 

pass_by_array(foo); 

return 0; 
} 

這裏的結果我得到:

size of array in main: 24 
size of element in main: 4 
size of array in func: 8 
size of element in func: 4 

所以到底是在那裏去?數組的大小改變了?!

+0

在C和C++風格的數組上需要的一切:http://stackoverflow.com/q/4810664/1619294 –

+0

看看http://stackoverflow.com/questions/1461432/what-is-array-decaying並查看接受的答案 –

+0

您從未將數組大小傳遞給'pass_by_array',那麼它應該如何知道? (考慮'pass_by_array'是否在單獨的編譯單元中。) –

回答

4

當你將一個數組傳遞給一個函數時,它會衰減成一個指向它的第一個元素的指針。因此sizeof(a)實際上給你一個指針int的大小。在你的機器上,看起來這是8.

如果你想傳遞一個數組到一個函數,使得數組仍然知道它的大小,使用std::vectorstd::array,而不是一個普通的C風格的數組。

0

按照您的程序:

int a_len = sizeof(foo); 
int e_len = sizeof(foo[0]); 

functionvariable所以compiler可以把它解釋爲array,因爲它是在哪裏它是declaredinitialized的功能相同stack frame

對於你的程序: main()

而當你傳遞數組到另一個功能

pass_by_array(foo); 

它被轉換作爲在接收功能和存儲的堆棧幀中定義的指針數組的地址。

的是因爲那按你的計劃:

int a_len = sizeof(a); 
int e_len = sizeof(a[0]); 

第一條語句會給你的int* asizeof (pointer)int大小爲每compiler。 作爲指針可以作爲一個數組a[0]它會給你sizeof(int)

希望這將有助於你理解。