2013-07-12 12 views
8

मुझे इस बारे में अनिश्चितता है कि रिकर्सन के दौरान मेमोरी में चर कैसे बनाए जाते हैं और संग्रहीत किए जाते हैं। नीचे एक उदाहरण सी प्राइमर प्लस से लिया है:पुनरावृत्ति में स्मृति में चर कैसे संग्रहीत किए जाते हैं?

#include <stdio.h> 
void recursiontest(int); 

int main(){ 
    recursiontest(3); 
    return 0; 
} 


void recursiontest(int n){ 
    printf("Level %d : %#x\n", n, &n); 
    if(n < 4) 
     recursiontest(n + 1); 
    printf("LEVEL %d : %#x\n", n, &n); 
    return; 
} 

कौन सा उत्पादन पैदावार:

स्तर 3: 0x3ce1f8bc

स्तर 4: 0x3ce1f89c

स्तर 4: 0x3ce1f89c

स्तर 3: 0x3ce1f8bc

ऐसा प्रतीत होता है कि मूल फ़ंक्शन कॉल में "n" परिवर्तनीय स्थानीय पहले (और केवल) रिकर्सिव कॉल की तुलना में क्रमशः एक पते का पता है। ऐसा क्यों है?

जब मैं कोई फ़ंक्शन कॉल करता हूं, तो इसके औपचारिक पैरामीटर घोषित किए गए वास्तविक तर्क के संदर्भ में घोषित और परिभाषित नहीं होते हैं? इसका मतलब यह नहीं होगा कि पहले कॉल के लिए पूर्णांक एन स्थानीय दूसरे (रिकर्सिव) कॉल से पहले बनाया गया है? दूसरी कॉल के एन को पहले कॉल से पहले पता कैसे हो सकता है?

+0

वास्तव में एक अंतर देखने के लिए * * * कम एन मान (जैसे, -99) का उपयोग करें। – Makoto

उत्तर

8

ऐसा इसलिए है क्योंकि पुनरावर्ती फ़ंक्शन कॉल के दौरान बनाए गए स्थानीय स्वचालित चर ढेर पर संग्रहीत होते हैं, और स्टैक x86 समेत अधिकांश प्लेटफ़ॉर्म पर उच्च से निम्न पते से "नीचे" बढ़ता है। इस प्रकार एक फ़ंक्शन जिसे बाद में प्रक्रिया में कहा जाता है, में पहले के फ़ंक्शन कॉल से संग्रहीत चर के मुकाबले "निचले" पते वाले चर होंगे।

+1

+1 क्योंकि यह उत्तर उल्लेख करता है कि प्रत्येक फ़ंक्शन कॉल के साथ चर बनाए जाते हैं – tay10r

3

स्थानीय चर (फ़ंक्शन तर्क सहित) स्टैक में संग्रहीत हैं। ढेर कम पतों की ओर बढ़ता है, जो है कि तुम क्या पर ध्यान दें:

Memory diagram

इस प्रकार, गहरी आप प्रत्यावर्तन में जाना, कम पतों किया जाएगा।

0

ऐसा इसलिए है क्योंकि स्थानीय चर ढेर पर हैं, और ढेर को उच्च स्मृति से कम स्मृति तक आवंटित किया जाता है। ऐसा कहने के लिए, पहले एक चर परिभाषित किया गया है, जितना अधिक उसका पता होगा।

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

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