Переменная, созданная на куче, 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
Не возвращает значение указателя, он возвращает адрес указателя. Это из-за &
, который в этом контексте означает «адрес».
Т.е. на 0042FCB4 в памяти есть указатель, указывающий на 0042FBB0 (т. Е. В большой энденной среде, вы увидите 00 42 Fb B0 на 0042FCB4).