ヒープで作成された変数、同じ変数を指す2つのポインターには異なるアドレスがありますか?

StackOverflow https://stackoverflow.com/questions/4295346

  •  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 . . .
役に立ちましたか?

解決

ポインターが指しているアドレスではなく、ポインターのアドレスを報告しています。もちろん、ポインターのアドレスは異なります pTemppHeap2;これらは、メモリ内の同じアドレスを指していることがたまたま異なるポインターです。を削除します & プレフィックス pTemppHeap2 あなたが期待している結果を見るために。

写真は次のようなものです:

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

ここにあなたはそれを持っています &pTemp0042FBB0&pHeap20042FCB4. 。アドレスの住所を作成しました pTemppHeap2 (もちろん、結果は実行ごとに異なる可能性がある)を指しています。 & プレフィックス pTemppHeap2 それからあなたは見るでしょう 0042FBC0 代わりにそれぞれの場合に印刷されます。

他のヒント

はい、 pTemppHeap2 同じでなければなりません。しかし &pTemp&pHeap2 異なっています。これは、 & オペレーターは、オペランドへのポインターを返します。そう pTemp のポインターです int, 、 その間 &pTemp ポインターへのポインターです int.

&pHeap2 ポインターの値を返さず、ポインターのアドレスを返します。それは &, 、この文脈では、「アドレス」を意味します。

IEで0042FCB4メモリには、0042FBB0を指すポインターがあります(つまり、ビッグエンディアン環境では、0042FCB4で00 42 FB B0が表示されます)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top