Je viens d'apprendre la différence entre la pile et le tas. Après avoir créé une fonction qui allouera dynamiquement de la mémoire sur le tas pour moi, je retourne le pointeur et affiche (dans et hors de la fonction) l'adresse et la valeur de chaque pointeur.Variable créée sur le tas, 2 pointeurs pointant vers la même variable ont des adresses différentes?
Les valeurs sont les mêmes, ce que j'attendais, mais les adresses pour le même morceau de mémoire sur le tas sont différentes, ce que je ne m'attendais pas.
Pourquoi? Should pHeap2 et pTemp ne devraient pas pointer vers la même adresse?
#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;
}
Sortie:
*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 . . .
bien dit. jolie photo. +1 – Lee
Mec, merci beaucoup. Je suppose que je savais que & var donne l'adresse de QUE VARIABLE, mais j'ai oublié que les pointeurs vont avoir leurs propres adresses, et POINT à DIFFÉRENTES ADRESSES. J'ai modifié mon code et ajouté: cout << "Pointant vers: \ t" << pHeap2 << endl; cout << "Pointant vers: \ t" << pTemp << endl; dans leurs domaines respectifs, et maintenant je reçois ce que je cherchais! Pour obtenir l'adresse vers laquelle il pointe, je n'utilise pas l'opérateur de référence, car ce sera l'adresse de cette variable :) Merci Jason !! – shadowprotocol
@shadowprotocol: Ouais, c'est que '& pTemp' et' & pHeap2' sont des pointeurs vers des pointeurs et ce sont les adresses au-dessus des cases gauche et droite de l'image. – jason