我是愚蠢的在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;
}
我是愚蠢的在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;
}
在main
,名字array
是一個數組,所以你在sizeof
數組的字節獲得大小。然而,當一個數組傳遞給一個函數時,數組會衰減到一個指針,所以你在函數內部得到了sizeof(int*)
。
請注意,以T arg[]
的形式參數爲,確切地說與將參數作爲T* arg
相同。所以你的功能是完全等價的
void function(int* arg) {
cout << sizeof(arg) << endl;
}
你的程序在下面是類似的下一個。
void function (int arg[]) {
cout<<sizeof(arg)<<endl; // 4
}
下面的程序打印指針的大小。
void function (int *arg) {
cout<<sizeof(arg)<<endl; // 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])
陣列僅僅是用於指向的存儲器的任意的量。如果你做sizeof(數組),它將返回一個指針的大小 - 32位系統上有4個字節,64位系統上有8個字節(如果程序編譯爲64位)。
這與您必須在c/C++中以空值終止您的字符串來表示數組的末尾的原因相同。
簡而言之,您可以自己跟蹤陣列的大小。如果你分配一個40字節的數組,你必須確保你永遠不會訪問第40個索引之上的數組(即array [39])。
希望這會有所幫助。
如果數組只是指針,那麼如何在main中打印12呢? – fredoverflow 2012-03-01 07:33:13
我不能100%確定,但我的猜測是因爲你的數組是靜態的。它的大小是在編譯時確定的,與動態內存不同。Sizeof()可以在靜態數組上工作,但是我可以向你保證它不會在運行時動態分配的數組上工作。 – Gogeta70 2012-03-01 14:08:20
數組不是簡單的指針。 – xaxxon 2017-09-09 01:26:48
[Sizeof array作爲參數傳遞](http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) – Blastfurnace 2012-03-01 02:37:44
參見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