2010-11-28 102 views
3

我剛剛瞭解到堆棧和堆之間的區別。創建一個函數後,將爲我動態分配堆上的內存,然後返回指針並顯示(進出函數)每個指針的地址和值。堆上創建的變量,指向相同變量的2個指針具有不同的地址?

這些值與我的預期相同,但堆中同一塊內存的地址是不同的,這並不是我所期望的。

爲什麼? pHeap2和pTemp不應該指向相同的地址嗎?

#include <iostream> 
using namespace std; 

int* intOnHeap(); // returns an int on the heap 
int main() 
{ 
int* pHeap = new int; // new operator allocates memory on the heap and returns its address 
     // 'new int' allocates enough memory on heap for one int and returns the address on the heap for that chunk of memory 
     // 'int* pHeap' is a local pointer which points to the newly allocated chunk of memory 
*pHeap = 10; 
cout << "*pHeap: " << *pHeap << "\n\n"; 

int* pHeap2 = intOnHeap(); 
cout << "pHeap2:\n-----------" << endl; 
cout << "Address:\t" << &pHeap2 << "\n"; 
cout << "Value:\t\t" << *pHeap2 << "\n\n"; 

cout << "Freeing memory pointed to by pHeap.\n\n"; 
delete pHeap; 

cout << "Freeing memory pointed to by pHeap2.\n\n"; 
delete pHeap2; 

// get rid of dangling pointers 
    pHeap = 0; 
    pHeap2 = 0; 

system("pause"); 
return 0; 
} 

int* intOnHeap() 
{ 
int* pTemp = new int(20); 
cout << "pTemp:\n-----------" << endl; 
cout << "Address:\t" << &pTemp << "\n"; 
cout << "Value:\t\t" << *pTemp << "\n\n"; 
return pTemp; 
} 

輸出:

*pHeap: 10 

pTemp: 
----------- 
Address:  0042FBB0 
Value:   20 

pHeap2: 
----------- 
Address:  0042FCB4 
Value:   20 

Freeing memory pointed to by pHeap. 

Freeing memory pointed to by pHeap2. 

Press any key to continue . . . 

回答

5

您所報告的指針的地址,而不是指針所指向的地址。當然,對於pTemppHeap2,指針的地址是不同的;這些是恰好指向內存中相同地址的不同指針。刪除&前綴pTemppHeap2以查看您所期望的結果。

畫面是這樣的:

0042FBB0   0042FBC0  0042FCB4 
------------  ------  ------------ 
| 0042FBC0 |------>| 20 |<------| 0042FBC0 | 
------------  ------  ------------ 
pTemp       pHeap2 

在這裏,你有&pTemp0042FBB0&pHeap20042FCB4。我編寫了地址pTemppHeap2指向的地址(當然,結果可能因運行而異),如果您刪除前綴pTemppHeap2&,則會在每種情況下都會看到0042FBC0

+0

說得好。漂亮的圖片。 +1 – Lee 2010-11-28 04:27:31

0

&pHeap2不返回指針的值,它返回指針的地址。這是因爲&,在這種情況下意味着「地址」。

即在存儲器中的0042FCB4處,存在指向0042FBB0的指針(即,在大端環境中,您將在0042FCB4處看到00 42 FB B0)。

1

是的,pTemppHeap2應該是一樣的。但是&pTemp&pHeap2是不同的。這是因爲&運算符返回一個指向它的操作數的指針。所以pTemp是指向int的指針,而&pTemp是指向指向int的指針。

相關問題