簡體   English   中英

在堆上創建的變量,指向同一變量的2個指針有不同的地址?

[英]Variable created on the heap, 2 pointers pointing to same variable have different addresses?

我剛剛學會了堆棧和堆之間的區別。 在為我創建一個將在堆上動態分配內存的函數之后,我返回指針並顯示(進出函數)每個指針的地址和值。

這些值是我所期望的,但是堆上相同內存塊的地址是不同的,這是我沒想到的。

為什么? 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 . . .

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

圖片是這樣的:

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

在這里你有&pTemp0042FBB0&pHeap20042FCB4 我為pTemppHeap2指向的地址pTemp了一個地址(當然,結果可能會因運行而異),如果你刪除&前綴pTemppHeap2那么你會看到在每種情況下打印0042FBC0

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

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

即在內存中的0042FCB4處,有一個指針指向0042FBB0(即在大端環境中,你會在0042FCB4看到00 42 FB B0)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM