Variable, die auf dem Haufen erstellt wurden, haben 2 Zeiger, die auf die gleiche Variable zeigen, unterschiedliche Adressen?

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

  •  28-09-2019
  •  | 
  •  

Frage

Ich habe gerade den Unterschied zwischen dem Stapel und dem Haufen gelernt. Nachdem ich eine Funktion erstellt habe, die für mich dynamisch Speicher auf dem Heap zuteilt, kehre ich den Zeiger zurück und zeige die Adresse und den Wert jedes Zeigers (in und außerhalb der Funktion).

Die Werte sind gleich, was ich erwartet habe, aber die Adressen an denselben Speicherblock auf dem Haufen sind unterschiedlich, was ich nicht erwartet habe.

Wieso den? Sollte Pheap2 und PTEMP nicht auf dieselbe Adresse hinweisen?

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

Ausgabe:

*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 . . .
War es hilfreich?

Lösung

Sie berichten über die Adresse der Zeiger, nicht die Adresse, auf die der Zeiger zeigt. Natürlich wird die Adresse des Zeigers anders sein für pTemp und pHeap2; Dies sind verschiedene Zeiger, die zufällig auf die gleiche Adresse im Speicher hinweisen. Entferne das & Präfixing pTemp und pHeap2 Um die Ergebnisse zu sehen, die Sie erwarten.

Das Bild ist so etwas:

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

Hier hast du das &pTemp ist 0042FBB0 und &pHeap2 ist 0042FCB4. Ich habe eine Adresse für die Adresse erfunden, die pTemp und pHeap2 zeigen auf (natürlich könnten die Ergebnisse sowieso variieren) und wenn Sie das entfernen & Präfixing pTemp und pHeap2 Dann würdest du sehen 0042FBC0 Stattdessen in jedem Fall gedruckt.

Andere Tipps

Ja, pTemp und pHeap2 sollte gleich sein. Aber &pTemp und &pHeap2 sind anders. Das liegt daran, dass die & Der Bediener gibt einen Zeiger an seinen Operanden zurück. So pTemp ist ein Zeiger auf eine int, während &pTemp ist ein Zeiger auf einen Zeiger auf eine int.

&pHeap2 Gibt den Wert des Zeigers nicht zurück, sondern gibt die Adresse des Zeigers zurück. Das liegt an der &, was in diesem Zusammenhang "die Adresse von" bedeutet.

IE bei 0042FCB4 im Speicher gibt es einen Zeiger, der auf 0042FBB0 zeigt (dh in einer Big-Endian-Umgebung, Sie würden 00 42 FB B0 bei 0042FCB4 sehen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top