arrays - Allocation order on the stack -


मैं यह सी कोड चला रहा हूं

  #define STACKSIZE 65536 char d [STACKSIZE] ; अगर (((इंट) और [[STACKSIZE-1]) - ((इंट) और डी [0]) + 1! = STACKSIZE) {Printf ("स्टैक स्पेस आरक्षण असफल \ n"); बाहर जाएं (); } Printf ("% d से% d से% d बाइट्स के लिए आवंटित \ n", & amp; d, d + sizeof (d), sizeof (d)); ऑटो इंट ए = 3; Printf ("अब स्टैक पॉइंटर% d \ n" पर है, & amp; a;);  

और मुझे -4262832 से -41972 9 के आबंटित आउटपुट के रूप में मिलते हैं ताकि 65536 बाइट्स के लिए अब स्टैक पॉइंटर पर -4262836 है

इसका अर्थ है कि "a" सरणी के बाद स्टैक पर रखा जाता है लेकिन अगर मैं एक चर लंबाई सरणी (एक सरणी जिसका लंबाई रन टाइम में सेट किया गया है) का उपयोग करते हैं तो मुझे विपरीत व्यवहार मिलता है: ए को सरणी से पहले स्टैक पर रखा जाता है।

यह कोड है (यह है एक ही है लेकिन सरणी का आकार रनटाइम में सेट होता है)

  #define STACKSIZE 65536 int i = 1; चार डी [i * STACKSIZE]; अगर (((इंट) और [[STACKSIZE-1]) - ((इंट) और डी [0]) + 1! = STACKSIZE) {Printf ("स्टैक स्पेस आरक्षण असफल \ n"); बाहर जाएं (); } Printf ("% d से% d से% d बाइट्स के लिए आवंटित \ n", & amp; d, d + sizeof (d), sizeof (d)); ऑटो इंट ए = 3; Printf ("अब स्टैक पॉइंटर% d \ n" पर है, & amp; a;);  

यह आउटपुट है

से -4262856 से -4197320 इतनी के लिए 65536 बाइट्स के लिए अब स्टैक सूचक -4197312 पर है

इसलिए, समस्या क्या है?

धन्यवाद!

Itemprop = "text">

आप नहीं कर सकते और आपको परवाह नहीं है कि वेरिएबल कहां हैं, तो संकलक इन्हें किसी भी तरह दूर से अनुकूलित कर सकता है।

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


Comments

Popular posts from this blog

c# - How to capture HTTP packet with SharpPcap -

php - Multiple Select with Explode: only returns the word "Array" -

php - jQuery AJAX Post not working -