Переменная, созданная на куче, 2 указателя, указывающие на то же переменную, имеют разные адреса?

StackOverflow https://stackoverflow.com/questions/4295346

  •  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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top