c - स्मृति में कहां मेरे चर सी में संग्रहीत हैं?




memory memory-management (5)

इस बात पर विचार करके कि स्मृति को चार खंडों में विभाजित किया गया है: डेटा, ढेर, ढेर, और कोड, वैश्विक चर, स्थिर चर, निरंतर डेटा प्रकार, स्थानीय चर (परिभाषित और कार्यों में घोषित), चर (मुख्य कार्य में), पॉइंटर्स , और गतिशील रूप से आवंटित स्थान (मॉलोक और कॉलोक का उपयोग करके) स्मृति में संग्रहीत हो जाते हैं?

मुझे लगता है कि उन्हें निम्नानुसार आवंटित किया जाएगा:

  • वैश्विक चर -------> ढेर (दोनों स्थिर और वैश्विक चर ढेर में संग्रहीत हैं रॉबर्ट लाओफ़र बुक ऑब्जेक्ट उन्मुख प्रोग्रामिंग सी ++ में
  • स्टेटिक चर -------> ढेर
  • लगातार डेटा प्रकार -----> कोड
  • स्थानीय चर (कार्यों में घोषित और परिभाषित) --------> ढेर
  • वेरिएबल्स मुख्य समारोह में घोषित और परिभाषित -----> ढेर
  • पॉइंटर्स (उदाहरण के लिए, char *arr , int *arr ) -------> ढेर
  • गतिशील रूप से आवंटित स्थान (मॉलोक और कॉलोक का उपयोग करके) --------> ढेर

मैं केवल सी परिप्रेक्ष्य से इन चरों का जिक्र कर रहा हूं।

अगर मैं गलत हूं तो कृपया मुझे सही करें क्योंकि मैं सी के लिए नया हूं।


पॉइंटर्स (पूर्व: char * arr, int * arr) -------> ढेर

नहीं, वे ढेर या डेटा सेगमेंट में हो सकते हैं। वे कहीं भी इंगित कर सकते हैं।


मैं केवल सी परिप्रेक्ष्य से इन चरों का जिक्र कर रहा हूं।

सी भाषा के परिप्रेक्ष्य से, जो कुछ मायने रखता है वह सीमा, दायरा, जुड़ाव और पहुंच है; अलग-अलग मेमोरी सेगमेंट में मैप किए गए आइटम को कैसे कार्यान्वित किया जाता है, और यह अलग-अलग होगा। भाषा मानक मेमोरी सेगमेंट के बारे में बात नहीं करता है। अधिकांश आधुनिक वास्तुकला ज्यादातर वही कार्य करते हैं; ब्लॉक-स्कोप चर और फ़ंक्शन तर्क स्टैक, फ़ाइल-स्कोप से आवंटित किए जाएंगे और स्थैतिक चर डेटा या कोड सेगमेंट से आवंटित किए जाएंगे, डायनामिक मेमोरी को ढेर से आवंटित किया जाएगा, कुछ स्थिर डेटा केवल-पढ़ने वाले सेगमेंट में संग्रहीत किए जाएंगे , आदि।


आपको इनमें से कुछ अधिकार मिल गए हैं, लेकिन जो भी प्रश्न लिखते हैं, वे कम से कम एक प्रश्न पर आपको धोखा देते हैं:

  • वैश्विक चर -------> डेटा (सही)
  • स्थिर चर -------> डेटा (सही)
  • निरंतर डेटा प्रकार -----> कोड और / या डेटा। एक स्थिति के लिए स्ट्रिंग अक्षर पर विचार करें जब एक स्थिर स्वयं डेटा सेगमेंट में संग्रहीत किया जाएगा, और इसके संदर्भों को कोड में एम्बेड किया जाएगा
  • स्थानीय चर (कार्यों में घोषित और परिभाषित) --------> ढेर (सही)
  • main समारोह में घोषित और परिभाषित चर -----> ढेर भी ढेर (शिक्षक आपको चाल करने की कोशिश कर रहा था)
  • पॉइंटर्स (उदा: char *arr , int *arr ) -------> संदर्भ के आधार पर ढेर डेटा या ढेर। सी आपको वैश्विक या static सूचक घोषित करने देता है, जिस स्थिति में सूचक स्वयं डेटा सेगमेंट में समाप्त हो जाएगा।
  • गतिशील आवंटित स्थान ( calloc , calloc , calloc का उपयोग करके) --------> ढेर ढेर

यह उल्लेखनीय है कि "ढेर" आधिकारिक तौर पर "स्वचालित भंडारण वर्ग" कहा जाता है।


उन भविष्य के आगंतुकों के लिए जो उन स्मृति खंडों के बारे में जानने में रुचि रखते हैं, मैं सी में 5 मेमोरी सेगमेंट के महत्वपूर्ण बिंदु लिख रहा हूं:

कुछ सिर ऊपर:

  1. जब भी एक सी प्रोग्राम निष्पादित किया जाता है तो प्रोग्राम निष्पादन के लिए रैम में कुछ स्मृति आवंटित की जाती है। इस स्मृति का उपयोग अक्सर निष्पादित कोड (बाइनरी डेटा), प्रोग्राम चर, इत्यादि को संग्रहीत करने के लिए किया जाता है। नीचे मेमोरी सेगमेंट इसके बारे में बात करते हैं:
  2. आम तौर पर तीन प्रकार के चर होते हैं:
    • स्थानीय चर (जिसे सी में स्वचालित चर के रूप में भी कहा जाता है)
    • सार्वत्रिक चर
    • स्थिर चर
    • आपके पास वैश्विक स्थैतिक या स्थानीय स्थैतिक चर हो सकते हैं, लेकिन उपर्युक्त तीन मूल प्रकार हैं।

सी में 5 मेमोरी सेगमेंट:

1. कोड सेगमेंट

  • कोड सेगमेंट जिसे टेक्स्ट सेगमेंट भी कहा जाता है, वह स्मृति का क्षेत्र है जिसमें अक्सर निष्पादित कोड होता है।
  • कोड सेगमेंट अक्सर बफर-ओवरफ्लो इत्यादि प्रोग्रामिंग बग द्वारा ओवरराइड होने के जोखिम से बचने के लिए केवल पढ़ने के लिए होता है।
  • कोड सेगमेंट में स्थानीय चर जैसे प्रोग्राम चर शामिल नहीं हैं ( जिसे सी में स्वचालित चर के रूप में भी कहा जाता है ), वैश्विक चर आदि।
  • सी कार्यान्वयन के आधार पर, कोड सेगमेंट में केवल-पढ़ने वाले स्ट्रिंग अक्षर भी हो सकते हैं। उदाहरण के लिए, जब आप printf("Hello, world") तो स्ट्रिंग "हैलो, वर्ल्ड" कोड / टेक्स्ट सेगमेंट में बनाई जाती है। आप लिनक्स ओएस में size कमांड का उपयोग करके इसे सत्यापित कर सकते हैं।
  • आगे की पढाई

डेटा सेगमेंट

डेटा सेगमेंट को नीचे के दो भागों में विभाजित किया गया है और आमतौर पर ढेर क्षेत्र के नीचे या ढेर के ऊपर कुछ कार्यान्वयन में निहित है, लेकिन डेटा सेगमेंट ढेर और ढेर क्षेत्र के बीच कभी नहीं है।

2. अनियंत्रित डेटा सेगमेंट

  • इस खंड को बीएसएस के रूप में भी जाना जाता है।
  • यह स्मृति का वह हिस्सा है जिसमें निम्न शामिल हैं:
    1. अनियमित वैश्विक चर (सूचक चर सहित)
    2. निरंतर स्थिर वैश्विक चर
    3. अनियमित स्थानीय स्थैतिक चर
  • प्रारंभिक नहीं होने वाला कोई भी वैश्विक या स्थैतिक स्थानीय चर अनियमित डेटा सेगमेंट में संग्रहीत किया जाएगा
  • उदाहरण के लिए: वैश्विक परिवर्तनीय int globalVar; या स्थैतिक स्थानीय परिवर्तनीय static int localStatic; स्थानीय static int localStatic; अनियंत्रित डेटा सेगमेंट में संग्रहीत किया जाएगा।
  • यदि आप वैश्विक चर घोषित करते हैं और इसे 0 या NULL रूप में प्रारंभ करते हैं तो फिर भी यह अनियंत्रित डेटा सेगमेंट या बीएसएस पर जायेगा।
  • आगे की पढाई

3. प्रारंभिक डेटा सेगमेंट

  • यह सेगमेंट स्टोर करता है:
    1. प्रारंभिक वैश्विक चर (सूचक चर सहित)
    2. निरंतर वैश्विक चर शुरू किया
    3. प्रारंभिक स्थानीय स्थैतिक चर
  • उदाहरण के लिए: वैश्विक परिवर्तनीय int globalVar = 1; या स्थैतिक स्थानीय परिवर्तनीय static int localStatic = 1; स्थानीय static int localStatic = 1; प्रारंभिक डेटा सेगमेंट में संग्रहीत किया जाएगा।
  • इस सेगमेंट को आगे के प्रारंभिक पढ़ने-योग्य क्षेत्र और प्रारंभिक रीड-राइट क्षेत्र में वर्गीकृत किया जा सकता हैआरंभिक निरंतर वैश्विक चर प्रारंभिक केवल-पढ़ने वाले क्षेत्र में जाएंगे, जबकि वेरिएबल जिनके मान रनटाइम पर संशोधित किए जा सकते हैं, प्रारंभिक रीड-राइट क्षेत्र में जाएंगे
  • इस सेगमेंट का आकार प्रोग्राम के स्रोत कोड में मानों के आकार से निर्धारित होता है, और रन टाइम पर नहीं बदलता है
  • आगे की पढाई

4. सेगमेंट स्टैक

  • स्टैक सेगमेंट का उपयोग वेरिएबल्स को स्टोर करने के लिए किया जाता है जो फ़ंक्शंस के अंदर बनाए जाते हैं ( फ़ंक्शन मुख्य फ़ंक्शन या उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन हो सकता है ), वैरिएबल जैसे
    1. फ़ंक्शन के स्थानीय चर (पॉइंटर चर सहित)
    2. समारोह में पारित तर्क
    3. वापसी का पता
  • जैसे ही फ़ंक्शन निष्पादन समाप्त हो जाता है, स्टैक में संग्रहीत चर हटा दिए जाएंगे।
  • आगे की पढाई

5. हीप सेगमेंट

  • यह खंड गतिशील स्मृति आवंटन का समर्थन करना है। यदि प्रोग्रामर गतिशील रूप से कुछ मेमोरी आवंटित करना चाहता है तो सी में इसे calloc , calloc या calloc विधियों का उपयोग करके किया जाता है।
  • उदाहरण के लिए, जब int* prt = malloc(sizeof(int) * 2) तो आठ बाइट्स ढेर में आवंटित किए जाएंगे और उस स्थान के मेमोरी पते को वापस कर दिया जाएगा और ptr चर में संग्रहीत किया जाएगा। ptr चर या तो स्टैक या डेटा सेगमेंट पर होगा जिस तरह से इसे घोषित / इस्तेमाल किया जाता है।
  • आगे की पढाई

  • चर / स्वचालित चर ---> ढेर खंड
  • गतिशील आवंटित चर ---> ढेर खंड
  • प्रारंभिक वैश्विक चर -> डेटा खंड
  • अनियंत्रित वैश्विक चर -> डेटा अनुभाग (बीएसएस)
  • स्टेटिक चर -> डेटा खंड
  • स्ट्रिंग स्थिरांक -> पाठ अनुभाग / कोड अनुभाग
  • कार्य -> ​​पाठ अनुभाग / कोड अनुभाग
  • टेक्स्ट कोड -> टेक्स्ट सेक्शन / कोड सेक्शन
  • रजिस्टर्स -> सीपीयू रजिस्टर
  • कमांड लाइन इनपुट -> पर्यावरण / कमांड लाइन खंड
  • पर्यावरण चर -> पर्यावरण / कमांड लाइन खंड






types