在堆上创建的变量,指向同一变量的2个指针有不同的地址?

时间:2010-11-28 04:19:05

标签: c++ pointers heap-memory

我刚学会了堆栈和堆之间的区别。在为我创建一个动态地为堆分配内存的函数之后,我返回指针并显示(进出函数)每个指针的地址和值。

值与我预期的相同,但是堆上相同内存块的地址是不同的,这是我没想到的。

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

3 个答案:

答案 0 :(得分:5)

您正在报告指针的地址,而不是指针指向的地址。当然,pTemppHeap2的指针地址会有所不同;这些是恰好指向内存中相同地址的不同指针。移除&前缀pTemppHeap2以查看您期望的结果。

图片是这样的:

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

此处您&pTemp0042FBB0&pHeap20042FCB4。我为pTemppHeap2指向的地址编写了一个地址(当然,结果可能因运行而异)并且如果删除&前缀{{ 1}}和pTemp然后您会看到pHeap2代替每种情况。

答案 1 :(得分:1)

是的,pTemppHeap2应该相同。但&pTemp&pHeap2不同。这是因为&运算符返回指向它的操作数的指针。因此pTemp是指向int的指针,而&pTemp是指向int指针的指针。

答案 2 :(得分:0)

&pHeap2不返回指针的值,它返回指针的地址。那是因为&,在这个上下文中的意思是“地址”。

即。在0042FCB4的内存中,有一个指向0042FBB0的指针(即在大端环境中,你会在0042FCB4看到00 42 FB B0)。