2013-07-04 70 views
2

我寫了一個函數size,它將整型數組作爲參數。爲什麼長度函數返回2?

int length(int a[]) 
{ 

    return sizeof(a)/sizeof(int); 

} 

int main() 
{ 
    int a[] = {1,3,5,6,9,4,2,1,0,0}; 

    int len = sizeof(a)/sizeof(int); 

    cout << len; // This correctly prints 10 . 

    len = size(a); 

    cout << len; // But this print 2 .why ?? 

    return 0; 
} 

有人能解釋我這種行爲嗎? 謝謝。

+7

'INT長度(INT一個[])'是相同的'INT長度(INT * A)'。不要使用這種符號,因爲你可以看到,它是誤導性的。 –

+0

這將* *解釋:http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c – chris

+0

16位指針??? – 0x499602D2

回答

4

您得到2的原因是因爲sizeof(int *)sizeof(int)的兩倍大,並且在傳遞給函數時數組衰減爲指針。

有不同的方法來解決這個問題。在C++中,你可以使用一個std::vector<int> a = { ... };代替,這將解決這個問題(通過調用a.size()拿到大小,sizeof(a)是行不通的)。

+0

或者將數組傳遞給int(&)[N]' – 0x499602D2

+0

@Mats你可以給我一些關於std:vector教程的鏈接。我不知道這個 – Thinker

+0

http://www.cplusplus.com/reference/vector/vector/ 不是一個教程,但也許是一個起點。我相信谷歌與「教程C + +矢量」可能會給你一些其他的鏈接,至少有一些可能是好的 - 我沒有「學習」有關C + +(至少在這個級別),所以不知道一個很好的教程網站是。 –

0

由於sizeof(a)被返回指針的大小,這將是或者4個字節或取決於你的應用是否是32位或64位的8個字節。所以你需要使用一個單獨的變量來維持數組的長度。

或者更好的是,我會建議使用標準的集合類之一,像std::vector例如,因爲這會自動保持長度。