ヒープで作成された変数、同じ変数を指す2つのポインターには異なるアドレスがありますか?
-
28-09-2019 - |
質問
スタックとヒープの違いを学びました。ヒープでメモリを動的に割り当てる関数を作成した後、ポインターを返し、各ポインターのアドレスと値を表示します(関数の内外)。
値は同じですが、私が期待していましたが、ヒープ上の同じメモリの塊へのアドレスは異なりますが、予想していませんでした。
なんで? 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 . . .
解決
ポインターが指しているアドレスではなく、ポインターのアドレスを報告しています。もちろん、ポインターのアドレスは異なります pTemp
と pHeap2
;これらは、メモリ内の同じアドレスを指していることがたまたま異なるポインターです。を削除します &
プレフィックス pTemp
と pHeap2
あなたが期待している結果を見るために。
写真は次のようなものです:
0042FBB0 0042FBC0 0042FCB4
------------ ------ ------------
| 0042FBC0 |------>| 20 |<------| 0042FBC0 |
------------ ------ ------------
pTemp pHeap2
ここにあなたはそれを持っています &pTemp
は 0042FBB0
と &pHeap2
は 0042FCB4
. 。アドレスの住所を作成しました pTemp
と pHeap2
(もちろん、結果は実行ごとに異なる可能性がある)を指しています。 &
プレフィックス pTemp
と pHeap2
それからあなたは見るでしょう 0042FBC0
代わりにそれぞれの場合に印刷されます。
他のヒント
はい、 pTemp
と pHeap2
同じでなければなりません。しかし &pTemp
と &pHeap2
異なっています。これは、 &
オペレーターは、オペランドへのポインターを返します。そう pTemp
のポインターです int
, 、 その間 &pTemp
ポインターへのポインターです int
.
&pHeap2
ポインターの値を返さず、ポインターのアドレスを返します。それは &
, 、この文脈では、「アドレス」を意味します。
IEで0042FCB4メモリには、0042FBB0を指すポインターがあります(つまり、ビッグエンディアン環境では、0042FCB4で00 42 FB B0が表示されます)。