दिलचस्प पोस्ट
अजगर में एक साइट पिंग? कैसे ब्राउज़र विंडो / टैब बंद घटना का पता लगाने के लिए? एंड्रॉइड में डायजेस्ट यूथल्स का उपयोग करने की विधि नहीं मिली नक्शा टुकड़ा एपीआई v2 लेआउट के शीर्ष पर बटन कैसे जोड़ें सभी अन्य दृश्यों के ऊपर UIView जोड़ें, जिसमें स्थितिबारी शामिल है सर्वश्रेष्ठ जावा ओब्बुस्केटेक्टर? सत्र चर PHP काम नहीं कर रहा है कैसे संस्करण एक डेटाबेस में एक रिकॉर्ड को नियंत्रित करने के लिए क्यों एक आवारा </ p> अंत टैग एक खाली अनुच्छेद उत्पन्न करता है? सी # वर्गों और सदस्यों (क्षेत्रों, विधियों, आदि) के लिए डिफ़ॉल्ट दृश्यता? एएसपी.नेट अपडेटपैनेल में ग्रिडव्यू जेक्जरी डेमेक्चर जावा और एंड्रॉइड डेवलपमेंट में वीक रेफरेंस का उपयोग कैसे करें? मैं <text> युक्त एक संग्रहीत प्रक्रिया को कैसे प्राप्त करूं? स्ट्रिंग तुलना – एंड्रॉइड जीआईटी का उपयोग करना, मैं एक शाखा में एक फ़ाइल को कैसे अनदेखा कर सकता हूं, लेकिन क्या यह किसी अन्य शाखा में है?

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

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

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

  • ग्लोबल वैरिएबल ——-> ढेर (दोनों स्थैतिक और वैश्विक चर को ढेर में संग्रहीत किया जाता है क्योंकि रॉबर्ट लोअर के बुक ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग सी ++
  • स्थैतिक चर ——-> ढेर
  • लगातार डेटा प्रकार —–> कोड
  • स्थानीय चर (घोषित और फ़ंक्शन में परिभाषित) ——–> स्टैक
  • मुख्य फ़ंक्शन में घोषित और परिभाषित चर —–> ढेर
  • संकेतक (उदाहरण के लिए, 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; अप्रयुक्त डेटा सेगमेंट में संग्रहीत किया जाएगा
  • यदि आप एक वैश्विक वैरिएबल घोषित करते हैं और इसे 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 variable में संग्रहीत किया जाएगा। यह घोषित / उपयोग किए जाने के तरीके के आधार पर ptr चर या तो स्टैक या डाटा सेगमेंट पर होगा
  • आगे की पढाई

आपके गलत वाक्यों को ठीक किया

 constant data types -----> code //wrong 

स्थानीय स्थिर चर —–> ढेर

आरंभिक वैश्विक निरंतर चर —–> डेटा सेगमेंट

अनिर्धारित वैश्विक निरंतर चर —–> बीएसएस

 variables declared and defined in main function -----> heap //wrong 

मुख्य फ़ंक्शन में घोषित और परिभाषित चर —–> स्टैक

 pointers(ex:char *arr,int *arr) -------> heap //wrong dynamically allocated space(using malloc,calloc) --------> stack //wrong 

संकेतक (पूर्व: चार * arr, int * arr) ——-> उस पॉइंटर वैरिएबल का आकार स्टैक में होगा।

विचार करें कि आप n बाइट्स की याददाश्त आवंटित कर रहे हैं ( calloc या calloc का उपयोग करके) गतिशील और फिर सूचक बिंदु को इंगित करने के लिए। अब मेमोरी के n बाइट्स ढेर में हैं और पॉइंटर वैरिएबल रीक्यूरीज़ 4 बाइट्स (64 बिट मशीन 8 बाइट्स यदि) मेमोरी चक के n बाइट के शुरुआती सूचक को स्टोर करने के लिए स्टैक में होगा।

नोट: सूचक चर किसी भी खंड की स्मृति को इंगित कर सकते हैं।

 int x = 10; void func() { int a = 0; int *p = &a: //Now its pointing the memory of stack int *p2 = &x; //Now its pointing the memory of data segment chat *name = "ashok" //Now its pointing the constant string literal //which is actually present in text segment. char *name2 = malloc(10); //Now its pointing memory in heap ... } 

गतिशील रूप से आवंटित स्थान (मॉलोक, कॉलोक का उपयोग करते हुए) ——–> ढेर

एक लोकप्रिय डेस्कटॉप आर्किटेक्चर कई खंडों में प्रक्रिया की वर्चुअल मेमोरी विभाजित करता है:

  • पाठ सेगमेंट: इसमें निष्पादन योग्य कोड है। अनुदेश सूचक इस रेंज में मान लेता है।

  • डेटा सेगमेंट में ग्लोबल वैरिएबल (अर्थात स्थिर लिंक वाले ऑब्जेक्ट्स) शामिल हैं केवल-पढ़ने के लिए डेटा (जैसे स्ट्रिंग स्थिरांक) और अपरिवर्तित डेटा ("बीएसएस") में उप-विभाजित।

  • स्टैक सेगमेंट: इसमें प्रोग्राम के लिए डायनामिक मेमोरी है, अर्थात मुफ्त स्टोर ("ढेर") और सभी धागे के लिए स्थानीय स्टैक फ्रेम। पारंपरिक रूप से सी स्टैक और सी हीप स्टैक खंड में विपरीत छोर से बढ़ते थे, लेकिन मुझे विश्वास है कि अभ्यास को छोड़ दिया गया है क्योंकि यह बहुत असुरक्षित है

एसी कार्यक्रम आमतौर पर डेटा सेगमेंट में स्थैतिक भंडारण की अवधि के साथ ऑब्जेक्ट्स डालता है, फ्री स्टोर पर गतिशील रूप से आबंटित ऑब्जेक्ट्स, और थ्रेड के कॉल स्टैक पर स्वचालित ऑब्जेक्ट्स जिसमें यह रहता है।

अन्य प्लेटफार्मों पर, जैसे पुराने एक्स 86 रीयल मोड या एम्बेडेड डिवाइस पर, चीजें स्पष्ट रूप से भिन्न हो सकती हैं।

मैं इन पहलुओं को केवल सी परिप्रेक्ष्य से संदर्भित कर रहा हूँ।

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

संकेतक (पूर्व: चार * arr, int * arr) ——-> ढेर

नहीं, वे स्टैक पर या डेटा सेगमेंट में हो सकते हैं। वे कहीं भी बात कर सकते हैं

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