Variable creada en el montón, 2 punteros que apuntan a la misma variable tienen diferentes direcciones?

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

  •  28-09-2019
  •  | 
  •  

Pregunta

Acabo de aprender la diferencia entre la pila y el montón. Después de crear una función que me asignará dinámicamente la memoria en el montón para mí, devuelvo el puntero y la visualización (dentro y fuera de la función) la dirección y el valor de cada puntero.

Los valores son los mismos, lo que esperaba, pero las direcciones a la misma parte de la memoria en el montón son diferentes, lo que no esperaba.

¿Por qué? ¿No deberían PHEAP2 y PTemp sign a la misma dirección?

#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;
}

Producción:

*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 . . .
¿Fue útil?

Solución

Está informando la dirección de los punteros, no la dirección a la que apunta el puntero. Por supuesto, la dirección del puntero será diferente para pTemp y pHeap2; Estos son diferentes punteros que apuntan a la misma dirección en la memoria. Quitar el & prefijo pTemp y pHeap2 para ver los resultados que espera.

La imagen es algo como esto:

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

Aquí tienes eso &pTemp es 0042FBB0 y &pHeap2 es 0042FCB4. Inventé una dirección para la dirección que pTemp y pHeap2 están apuntando (por supuesto, los resultados pueden variar de ejecución a ejecución de todos modos) y si elimina el & prefijo pTemp y pHeap2 Entonces verías 0042FBC0 Impreso en su lugar en cada caso.

Otros consejos

Sí, pTemp y pHeap2 debería ser lo mismo. Pero &pTemp y &pHeap2 son diferentes. Esto es porque el & El operador devuelve un puntero a su operando. Asi que pTemp es un puntero a un int, tiempo &pTemp es un puntero a un puntero a un int.

&pHeap2 No devuelve el valor del puntero, devuelve la dirección del puntero. Eso es por el &, que en este contexto significa "la dirección de".

es decir, en 0042FCB4 en la memoria, hay un puntero que apunta a 0042FBB0 (es decir, en un entorno grande, verá 00 42 FB B0 en 0042FCB4).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top