2012-03-01 51 views
6

可能重複的大小:
Sizeof array passed as parameterC++陣列

我是愚蠢的在C++中sizeof操作符,你有什麼想法,爲什麼它是4和12?

void function (int arg[]) { 
     cout<<sizeof(arg)<<endl; // 4 
    } 

    int main() 
    { 
     int array[] = {1, 2, 3}; 
     cout<<sizeof array<<endl; // 12 
     function (array); 
     return 0; 
    } 
+2

[Sizeof array作爲參數傳遞](http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) – Blastfurnace 2012-03-01 02:37:44

+0

參見http://stackoverflow.com/questions/1641957/is- array-name-a-pointer-in-c和http://stackoverflow.com/questions/720077/calculating-size-of-an-array - 這是一個FAQ。 – 2012-03-01 02:43:10

回答

23

main,名字array是一個數組,所以你在sizeof數組的字節獲得大小。然而,當一個數組傳遞給一個函數時,數組會衰減到一個指針,所以你在函數內部得到了sizeof(int*)

請注意,以T arg[]的形式參數爲,確切地說與將參數作爲T* arg相同。所以你的功能是完全等價的

void function(int* arg) { 
    cout << sizeof(arg) << endl; 
} 
0

你的程序在下面是類似的下一個。

void function (int arg[]) { 
    cout<<sizeof(arg)<<endl; // 4 
} 

下面的程序打印指針的大小。

void function (int *arg) { 
    cout<<sizeof(arg)<<endl; // 4 
} 
4
void function (int arg[]) // or void function (int arg[N]) 

相當於

void function (int *arg) 

因此,

sizeof(arg) == sizeof(int*) 

如果打算通過陣列本身,則C++提供你通過引用傳遞它:

void function (int (&arg)[3]) 
       // ^^^ pass by reference 

現在,

sizeof(arg) == sizeof(int[3]) 
-1

陣列僅僅是用於指向的存儲器的任意的量。如果你做sizeof(數組),它將返回一個指針的大小 - 32位系統上有4個字節,64位系統上有8個字節(如果程序編譯爲64位)。

這與您必須在c/C++中以空值終止您的字符串來表示數組的末尾的原因相同。

簡而言之,您可以自己跟蹤陣列的大小。如果你分配一個40字節的數組,你必須確保你永遠不會訪問第40個索引之上的數組(即array [39])。

希望這會有所幫助。

+0

如果數組只是指針,那麼如何在main中打印12呢? – fredoverflow 2012-03-01 07:33:13

+0

我不能100%確定,但我的猜測是因爲你的數組是靜態的。它的大小是在編譯時確定的,與動態內存不同。Sizeof()可以在靜態數組上工作,但是我可以向你保證它不會在運行時動態分配的數組上工作。 – Gogeta70 2012-03-01 14:08:20

+1

數組不是簡單的指針。 – xaxxon 2017-09-09 01:26:48