संकलक में मान कैसे भरता है char array[100] = {0};
? इसके पीछे क्या जादू है?
मैं जानना चाहता था कि आंतरिक रूप से संकलक कैसे आरंभ करता है।
संकलक में मान कैसे भरता है char array[100] = {0};
? इसके पीछे क्या जादू है?
मैं जानना चाहता था कि आंतरिक रूप से संकलक कैसे आरंभ करता है।
जवाबों:
यह जादू नहीं है।
सी में इस कोड का व्यवहार सी विनिर्देश के खंड 6.7.8.21 में वर्णित है ( सी कल्पना का ऑनलाइन ड्राफ्ट ): उन तत्वों के लिए जिनके पास एक निर्दिष्ट मूल्य नहीं है, संकलक पॉइंटर्स को NULL और अंकगणितीय प्रकारों को शून्य में आरंभ करता है ( और पुनरावर्ती समुच्चय पर यह लागू होता है)।
C ++ में इस कोड का व्यवहार C ++ विनिर्देशन ( C ++ युक्ति का ऑनलाइन मसौदा ) की धारा 8.5.1.7 में वर्णित है : संकलक उन तत्वों को आरंभ करता है जिनमें निर्दिष्ट मान नहीं होता है।
यह भी ध्यान दें कि C ++ (लेकिन C नहीं) में, आप एक खाली इनिशियलाइज़र सूची का उपयोग कर सकते हैं, जिससे कंपाइलर एरे के सभी तत्वों को एकत्रित कर सकता है:
char array[100] = {};
जब आप ऐसा करते हैं तो संकलक किस तरह का कोड उत्पन्न कर सकता है, इस सवाल पर एक नज़र डालें: सरणी 0-प्रारंभ से अजीब विधानसभा
कंपाइलर डेवलपर्स के लिए कार्यान्वयन है।
यदि आपका प्रश्न "इस तरह की घोषणा के साथ क्या होगा" - संकलक आपके द्वारा प्रदान किए गए मान के लिए पहला सरणी तत्व सेट करेगा (0) और अन्य सभी को शून्य पर सेट किया जाएगा क्योंकि यह लोप किए गए सरणी तत्वों के लिए डिफ़ॉल्ट मान है।
यदि आपका कंपाइलर GCC है तो आप सिंटैक्स का उपयोग भी कर सकते हैं:
int array[256] = {[0 ... 255] = 0};
कृपया http://gcc.gnu.org/oniltocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits देखें , और ध्यान दें कि यह एक कंपाइलर-विशिष्ट सुविधा है।
यह निर्भर करता है कि आपने यह इनिशियलाइज़ेशन कहाँ रखा है।
यदि ऐरे में जैसा स्थिर है
char array[100] = {0};
int main(void)
{
...
}
फिर यह वह कंपाइलर है जो प्रोग्राम के डेटा सेगमेंट में 100 0 बाइट्स को आरक्षित करता है। इस मामले में आप इनिशियलाइज़र को छोड़ सकते थे।
यदि आपकी सरणी ऑटो है, तो यह एक और कहानी है।
int foo(void)
{
char array[100] = {0};
...
}
इस मामले में फ़ंक्शन फू के हर कॉल पर आपको एक छिपी हुई याद होगी।
उपरोक्त कोड के बराबर है
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
और यदि आप इनिशियलाइज़र को छोड़ देते हैं तो आपके एरे में रैंडम डेटा (स्टैक का डेटा) होगा।
यदि आपके स्थानीय सरणी को स्थिर की तरह घोषित किया जाता है
int foo(void)
{
static char array[100] = {0};
...
}
फिर यह तकनीकी रूप से पहले वाले के समान ही मामला है।