المتغير الذي تم إنشاؤه على الكومة ، 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
لا تُرجع قيمة المؤشر ، فهو يعيد عنوان المؤشر. هذا بسبب &
, ، وهو ما يعني في هذا السياق "عنوان".
IE في 0042FCB4 في الذاكرة ، هناك مؤشر يشير إلى 0042FB0 (أي في بيئة كبيرة ، سترى 00 42 FB B0 في 0042FCB4).