2010-04-06 54 views
3

基本僞代碼如下所示:C++動態數組上漿問題

void myFunction() 
{ 

int size = 10; 

int * MyArray; 

MyArray = new int[size]; 

cout << size << endl; 

cout << sizeof(MyArray) << endl; 

} 

第一COUT返回10,如預期的,而第二COUT返回4

任何人都有一個解釋?

回答

8

只是一個指針,它在您的系統上具有四個字節的大小。

當您動態創建數組時,您需要自己跟蹤大小。

如果創建一個自動陣列或靜態數組,

int MyArray[10]; 

然後sizeof(MyArray)將40只要陣列衰減到指針,不過,例如當你將它傳遞給一個函數時,尺寸信息就會丟失。

+0

完美的迴應,謝謝! – Peter 2010-04-06 04:49:51

2

Related to a recent question.

指針是一個指針,無論它指向。你必須自己跟蹤尺寸。最好是使用std::vector


sizeof返回表達式,在此情況下是類型int*的大小的大小。不管其價值如何,它總是具有相同的尺寸。

爲了比較,考慮:

int i = 0; 
i = 23434634; 

無論i呈現什麼價值,i本身規模仍只有sizeof(i) == sizeof(int)。指針是相同的,它只是擁有不同的價值。

0

的類型爲int*sizeof()在變量上調用時返回該變量類型的大小。

雖然數組有特殊情況,但它僅適用於堆棧數組(即int MyArray[3];)。

0

int*,並sizeof(int*)您的系統上是4

數組。它是一個指向恰好指向分配數組的內存塊的指針。

int MyArray[10]; 
cout << sizeof(MyArray) << endl; 

應打印40,這是多麼大的10個int小號恰好是你的系統上。在這種情況下, 的數組。所以這個類型的大小包含了數組中所有元素的大小。

在這第二種情況下會衰減成指針,但它們仍然是兩種截然不同的類型。

0
#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 
+1

其值得指出的是你對MyArray的定義是一個非標準擴展。 – 2010-04-06 05:01:39