2009-08-24 16 views

उत्तर

11

क्या आप सामान्य रूप से पॉइंटर्स के बारे में पूछ रहे हैं?

अधिकांश ऑपरेटिंग सिस्टम पर, वे तार्किक पते हैं।

ऑपरेटिंग सिस्टम वर्चुअल मेमोरी और पेजिंग तंत्र के माध्यम से उन्हें भौतिक पते में अनुवाद करने के लिए ज़िम्मेदार है। यह कार्यक्रम के लिए पारदर्शी है। यही कारण है कि एक गुमराह कार्यक्रम "सीमाओं को हिट करता है" और जीपीएफ।

कुछ पुराने सिस्टम (उदा।, डीओएस) पर, वे भौतिक होंगे, जिससे आप स्मृति के अन्य हिस्सों में सामान को ओवरराइट कर सकते हैं।

7

ओएस पर निर्भर करता है और आपका कोड किस स्तर पर चल रहा है।

एक आधुनिक ओएस पर एक सामान्य उपयोगकर्ता-भूमि कार्यक्रम के लिए, आपको वर्चुअल पता मिलेगा।

+1

लेकिन यदि मैं निम्नलिखित प्रोग्राम चलाता हूं: int main() {int (* p)(); पी = मुख्य; printf ("% p", p);} यह 0x80483c4 जैसे पते दे रहा है, ऐसा लगता है कि यह भौतिक पता है, इस तरह के बड़े पते पर मुख्य प्रारंभ का वर्चुअल पता क्यों होगा ?? मैं इसे linux.plz पर चला रहा हूं अगर मैं गलत हूं तो स्पष्ट करें ?? – mawia

+4

आप गलत हैं। यह एक आभासी पता है। किसी ने भी नहीं कहा कि आपका मुख्य() फ़ंक्शन वर्चुअल एड्रेस 0 पर लोड हो जाता है। असल में, ईएलएफ बाइनरीज़ (लिनक्स में प्रयुक्त) में डिफ़ॉल्ट रूप से कोड सेगमेंट वर्चुअल एड्रेस 0x80482c0 पर शुरू होता है, जो ठीक से दिखता है (कुछ छुपे हुए सेट-अप हैं मुख्य से पहले कोड())। ध्यान रखें कि आभासी पता स्थान अक्सर गैर-संगत होता है, और आभासी पते केवल तभी आवंटित किए जाते हैं जब आप उनका उपयोग करते हैं। सिर्फ इसलिए कि आपका प्रोग्राम 0x80482c0 पर लोड किया गया है इसका मतलब यह नहीं है कि वहां और 0x0 के बीच की सभी चीज़ों को आवंटित कर दिया गया है। –

+0

यदि आप लिनक्स के तहत स्मृति में अपना प्रोग्राम व्यवस्थित करने के बारे में वास्तव में रुचि रखते हैं, तो इसे पढ़ लें: http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html –

संबंधित मुद्दे