在堆上创建的变量,指向相同变量的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)。
不隶属于 StackOverflow