2012-03-25 15 views
5

यदि मैं ढेर और ढेर पर एक चर (सूचक) के पते की लंबाई के बीच कोई सहसंबंध है तो मैं उत्सुक हूं। कई अवसरों पर मैंने देखा है कि ढेर की तुलना में स्टैक चर के संबंध में आमतौर पर अधिक समय होते हैं। उदाहरण के लिए निम्नलिखित साधारण परीक्षण पर विचार करें:ढेर और ढेर पर स्मृति स्थान पैटर्न

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int i = 0; 
    int *j = malloc(sizeof(int)); *j = 0; 

    printf("&i = %p\n j = %p\n", &i, j); 

    free(j); 
    return 0; 
} 

उत्पादन:

&i = 0x7fffe9c7fa5c 
j = 0x100e010 

इन परिणामों gcc का उपयोग कर linux में प्राप्त कर रहे हैं; क्या यह ओएस/कंपाइलर निर्भर हो सकता है?

+0

100% निश्चित नहीं है, लेकिन मुझे लगता है कि यह उस क्रम में विशिष्ट CPU/OS/कंपाइलर है। इसके अलावा, आप शायद एक भौतिक पता भी नहीं देख रहे हैं। इसके अलावा, ढेर बढ़ता है और ढेर बढ़ता है, इसलिए एक स्टैक वैरिएबल का पता कम हो जाता है। – Corbin

उत्तर

2

परिणाम कार्यक्रम के पता स्थान में ढेर (एस) और ढेर की स्थिति पर निर्भर करते हैं। ये लिंकर और प्रोसेसर आर्किटेक्चर द्वारा निर्धारित किए जाते हैं।

ASLR के कारण, सटीक संख्याएं आधुनिक सिस्टम पर यादृच्छिक होनी चाहिए।

फिर भी, ढेर आमतौर पर ऊपर की ओर बढ़ते हैं, और नीचे ढेर होते हैं। इसके अतिरिक्त, प्रदर्शन और स्मृति प्रबंधन कारणों के लिए, ढेर और ढेर दोनों हमेशा page सीमाओं पर शुरू होंगे।

2

मुझे विश्वास है कि यह स्मृति के भौतिक हिस्सों की वजह से है जिसे हम तय करते हैं कि उन्हें ढेर और ढेर कहा जाता है। चूंकि वे विपरीत सिरों पर शुरू होते हैं और बीच की तरफ बढ़ते हैं, यह समझ में आता है कि कोई कम है और दूसरा उच्च है। यह देखना दिलचस्प होगा कि क्या होता है यदि आप ढेर पर लगातार 2 वर्रों और ढेर पर लगातार 2 आवंटित करते हैं। इससे मदद मिलेगी कि किस तरह ढेर और ढेर बढ़ते हैं। असल में मुझे लगता है कि इस काम के लिए आपको एक नया स्टैक फ्रेम (एक नई विधि) बनाने और वहां दूसरे वर्रों को आवंटित करने की आवश्यकता है, अन्यथा आप एक ही स्टैक फ्रेम में रहते हैं।

+0

एक सामान्य उपयोगकर्ता स्पेस प्रोग्राम के लिए, पता स्थान पर भौतिक स्मृति पते से कोई लेना देना नहीं है। अन्यथा, एक अप्रतिबंधित प्रक्रिया कुछ विशिष्ट भौतिक स्मृति आवंटित करके एक डीओएस हमला शुरू कर सकती है, और इस तरह एक ही प्रक्रिया को उसी स्मृति पते आवंटित करने से रोकती है। यह सब आभासी है। – phihag

+0

यह आपके सिस्टम के आधार पर भौतिक या आभासी स्मृति हो सकता है। वैसे भी, दोनों सिरों से शुरू होता है और बीच की ओर बढ़ रहा है, आपको सभी उपलब्ध स्थान का उपयोग करने में अधिकतम लचीलापन देता है। –

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