基本僞代碼如下所示:C++動態數組上漿問題
void myFunction()
{
int size = 10;
int * MyArray;
MyArray = new int[size];
cout << size << endl;
cout << sizeof(MyArray) << endl;
}
第一COUT返回10,如預期的,而第二COUT返回4
任何人都有一個解釋?
基本僞代碼如下所示:C++動態數組上漿問題
void myFunction()
{
int size = 10;
int * MyArray;
MyArray = new int[size];
cout << size << endl;
cout << sizeof(MyArray) << endl;
}
第一COUT返回10,如預期的,而第二COUT返回4
任何人都有一個解釋?
只是一個指針,它在您的系統上具有四個字節的大小。
當您動態創建數組時,您需要自己跟蹤大小。
如果創建一個自動陣列或靜態數組,
int MyArray[10];
然後sizeof(MyArray)
將40只要陣列衰減到指針,不過,例如當你將它傳遞給一個函數時,尺寸信息就會丟失。
指針是一個指針,無論它指向在。你必須自己跟蹤尺寸。最好是使用std::vector
。
sizeof
返回表達式,在此情況下是類型int*
的大小的大小。不管其價值如何,它總是具有相同的尺寸。
爲了比較,考慮:
int i = 0;
i = 23434634;
無論i
呈現什麼價值,i
本身規模仍只有sizeof(i) == sizeof(int)
。指針是相同的,它只是擁有不同的價值。
的類型爲int*
。 sizeof()
在變量上調用時返回該變量類型的大小。
雖然數組有特殊情況,但它僅適用於堆棧數組(即int MyArray[3];
)。
是int*
,並sizeof(int*)
您的系統上是4
是不數組。它是一個指向恰好指向分配數組的內存塊的指針。
int MyArray[10];
cout << sizeof(MyArray) << endl;
應打印40,這是多麼大的10個int
小號恰好是你的系統上。在這種情況下, 是的數組。所以這個類型的大小包含了數組中所有元素的大小。
在這第二種情況下會衰減成指針,但它們仍然是兩種截然不同的類型。
#include <iostream>
#define P(expr) std::cout << #expr << " = " << (expr) << std::endl
namespace {
void myFunction(size_t size) {
int *pointer = new int[size];
int MyArray[size];
P(size);
P(sizeof(MyArray));
P(sizeof(pointer));
delete [] pointer;
}
}
int main() {
myFunction(10);
}
輸出:
size = 10
sizeof(MyArray) = 40
sizeof(pointer) = 8
其值得指出的是你對MyArray的定義是一個非標準擴展。 – 2010-04-06 05:01:39
完美的迴應,謝謝! – Peter 2010-04-06 04:49:51