2015-12-20 13 views
11

मैं पूछना चाहता हूं कि सी में चर कैसे संग्रहीत किए जाते हैं?सी में एक परिवर्तनीय नाम कैसे संग्रहीत किया जाता है?

अधिक स्पष्ट निम्नलिखित कोड पर विचार होने के लिए:

int main() { 
    int a = 1, b; 
    b = a + 2; 
    return 0; 
} 
क्या स्मृति सी दुकानों चर स्थानों के नाम में

उदाहरण के लिए यहाँ।

जैसे अगर &a=0x12A7 (लगता है) &b=0x123B1, तो कैसे और कहाँ है भंडार चर नाम की तरह है, जिसमें स्मृति नाम a संग्रहीत किया जाता है?

उत्तर

12

सी चर के नाम को संग्रहीत नहीं करता है। इसका संकलक जो कंपाइलर के प्रतीक तालिका में चर के नामों को संग्रहीत करता है।
यह डेटा संरचना संकलक द्वारा बनाई और बनाए रखी जाती है।
टुकड़ा

// Declare an external function 
extern double bar(double x); 

// Define a public function 
double foo(int count) 
{ 
    double sum = 0.0; 

    // Sum all the values bar(1) to bar(count) 
    for (int i = 1; i <= count; i++) 
     sum += bar((double) i); 
    return sum; 
} 

कम से कम निम्नलिखित प्रतीक हो सकती है के लिए एक प्रतीक तालिका का एक example:

enter image description here

+3

एक प्रतीक तालिका एक संकलन निर्माण है, यह रनटाइम गुणों को प्रतिबिंबित नहीं करती है। मानचित्र फ़ाइलों और डीबग जानकारी स्थान के लिए प्रतीक नामों का विचार प्राप्त करने के लिए उपलब्ध स्रोत हैं, लेकिन वे प्रोग्राम के भीतर से उपयोग नहीं किए गए थे .. आरटीटीआई और आत्मनिरीक्षण के अन्य रूप हैं, लेकिन सी का कोई भी रूप नहीं है –

18

परिवर्तनीय नामों को बिल्कुल भी संग्रहीत करने की आवश्यकता नहीं है! कंपाइलर पूरी तरह से छुटकारा पा सकता है। कल्पना कीजिए, अगर संकलक काफी चालाक है, यह इस करने के लिए अपने पूरे कार्यक्रम को कम कर सकते हैं:

int main(){ 
    return 0; 
} 

ध्यान दें कि इस कार्यक्रम का प्रभाव आपके मूल रूप में ही है, और अब वहाँ सब पर कोई चर रहे हैं! अब उन्हें नाम देने की जरूरत नहीं है, है ना?

भले ही आपके कोड में चर का उपयोग किया गया हो, फिर भी जब आप प्रोग्राम लिखते हैं तो उनके नाम पूरी तरह से सुविधाजनक संकेत होते हैं, लेकिन प्रोसेसर द्वारा आपके कोड को निष्पादित करने की आवश्यकता नहीं होती है। जहां तक ​​एक माइक्रोप्रोसेसर का संबंध है, इस तरह एक समारोह:

ADD # consumes top two values on stack (x and y), pushes result (z) 
PUSH 2 # pushes 2 on stack 
MULT # consumes top two values on stack (z and 2), pushes result 
RET 

अब कहानी:

int foo(int x, int y) { 
    int z = x + y; 
    return z * 2; 
} 

संकलित कोड है कि इस करता है, कुछ काल्पनिक सरल अनुदेश सेट वास्तुकला (आईएसए) में हो सकती है क्या वे परिवर्तनीय नाम कभी-कभी डिबगिंग उद्देश्यों के लिए संग्रहीत होते हैं। उदाहरण के लिए यदि आप जीसीसी का उपयोग कर रहे हैं तो आप "प्रतीक तालिका" को उत्सर्जित करने के लिए -g विकल्प पास कर सकते हैं जिसमें डीबगिंग के लिए चर नामों जैसी चीजें शामिल हैं। लेकिन इसे केवल एक प्रोग्राम चलाने के लिए जरूरी नहीं है, और यह भाषा मानक द्वारा कवर नहीं है - यह एक कार्यान्वयन सुविधा है जो मंच से अलग है।

+0

ठीक है मुझे कुछ विचार मिला –

-1

ठीक पहले अगर आप सिर्फ सी इस के साथ स्ट्रेट पर अपना सिर हो रही है बंद कहां से शुरू करना है: http://condor.cc.ku.edu/~grobe/intro-to-C.shtml

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

https://en.wikipedia.org/wiki/Memory_management

"जब से आवंटन का सटीक स्थान पहले से ज्ञात नहीं है, स्मृति परोक्ष रूप से आम तौर पर एक सूचक संदर्भ के माध्यम से पहुँचा है। विशिष्ट स्मृति क्षेत्र को संगठित करने और आवंटित करने के लिए प्रयोग किया जाता एल्गोरिथ्म और पुनःआवंटन हिस्सा है कर्नेल के साथ आपस में जुड़े ... "

हमें वापस संकेत करने के लिए अमूर्त के साथ लाता है कौन सा चीजों के व्यावहारिक पक्ष को:

https://en.wikipedia.org/wiki/C_dynamic_memory_allocation

आशा है कि आपको हुड के नीचे क्या है इसकी एक छोटी स्पष्ट तस्वीर देता है:)

हैप्पी कोडिंग।

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