2010-11-28 5 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

+0

おい、そんなにありがとう。私は&varがその変数のアドレスを与えることを知っていたと思うが、ポインタは自分のアドレスを持つことを忘れていて、別のアドレスを指している。コードを変更して追加しました。 cout << "次へのポインティング:\ t" << pHeap2 << endl; cout << "ポインティング先:\ t" << pTemp << endl; それぞれの分野で、今私は何を探していたのですか?それが指しているアドレスを取得するには、参照演算子を使用しないでください。その変数のアドレスになります:) Thanks Jason !! – shadowprotocol

+0

@shadowprotocol:そうです、 '&pTemp'と'&pHeap2'はポインタのポインタであり、それらはピクチャの左右のボックスの上のアドレスです。 – jason

0

&pHeap2ポインタの値を返さない場合は、ポインタのアドレスを返します。これは、&のためです。この文脈では、「のアドレス」を意味します。

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

1

はい、pTemppHeap2は同じである必要があります。しかし、&pTemp&pHeap2は異なります。これは、&演算子がそのオペランドへのポインタを返すためです。従ってpTempintへのポインタであり、&pTempintへのポインタへのポインタです。

関連する問題