2010-11-28 103 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的指针。

相关问题