المتغير الذي تم إنشاؤه على الكومة ، 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 لا تُرجع قيمة المؤشر ، فهو يعيد عنوان المؤشر. هذا بسبب &, ، وهو ما يعني في هذا السياق "عنوان".

IE في 0042FCB4 في الذاكرة ، هناك مؤشر يشير إلى 0042FB0 (أي في بيئة كبيرة ، سترى 00 42 FB B0 في 0042FCB4).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top