सी में 0 से सरणी कैसे इनिशियलाइज़ करें?


170

मुझे एक वैश्विक के रूप में सी में एक बड़ी अशक्त सरणी की आवश्यकता है। क्या ऐसा करने का कोई तरीका है जो टाइप करने के अलावा है

char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };

?


26
चार शून्य [1024] = {0};

3
यदि आपको कभी भी ढेर पर मेमोरी आवंटित करने की आवश्यकता होती है, तो आप कॉलोक () का भी उपयोग कर सकते हैं। उदाहरण के लिए char * zeroarray = calloc (1024, sizoef (* zeroarray)); ।
आंद्रेई सिओबनू

2
NB कॉलॉक charआदि के लिए ठीक है , लेकिन यदि आप एक सरणी-पॉइंटर्स चाहते हैं, तो आपको उन्हें स्पष्ट रूप से NULL में सेट करना चाहिए, वहाँ (बेतुका!) कोई गारंटी नहीं है कि NULL को शून्य-बाइट के रूप में दर्शाया गया है। हालांकि यह शाब्दिक 0रूप से स्पष्ट रूप से अशक्त सूचक का प्रतिनिधित्व करता है।
एड्रियन रत्नापला

जवाबों:


284

वैश्विक चर और स्थिर चर स्वचालित रूप से शून्य से आरंभिक होते हैं। अगर आपके पास बस

char ZEROARRAY[1024];

वैश्विक स्तर पर यह रनटाइम पर सभी शून्य होगा। लेकिन वास्तव में है एक शॉर्टहैंड सिंटैक्स है यदि आपके पास स्थानीय सरणी है। यदि कोई सरणी आंशिक रूप से आरंभिक है, तो प्रारंभिक तत्व नहीं हैं जो उपयुक्त प्रकार के मान 0 प्राप्त करते हैं। आप लिख सकते हैं:

char ZEROARRAY[1024] = {0};

संकलक अलिखित प्रविष्टियों को शून्य से भर देगा। वैकल्पिक रूप से आप memsetप्रोग्राम स्टार्टअप पर सरणी को इनिशियलाइज़ करने के लिए उपयोग कर सकते हैं :

memset(ZEROARRAY, 0, 1024);

यह उपयोगी होगा यदि आपने इसे बदल दिया था और इसे वापस सभी शून्य पर रीसेट करना चाहते थे।


2
{0}; ठीक काम करता है, C99 [$ ६. /. 21 / २१] अगर किसी ब्रेस-एनक्लोज्ड लिस्ट में कम इनिशियलाइज़र हैं, तो एग्रीगेट के तत्व या सदस्य हैं, या एक स्ट्रिंग लिटरल में कम कैरेक्टर हैं, जो ज्ञात साइज़ की एक ऐरे को इनिशियलाइज़ करने के लिए उपयोग किए जाते हैं एरे में तत्वों, कुल के शेष को प्रारंभिक रूप से समान किया जाएगा जो स्थिर भंडारण अवधि वाली वस्तुओं के समान हैं
साशा ज़ेज़ुलिंस्की

कृपया देखें: प्रारंभिक 0 कोई नहीं है character। यह एक है integer
यंगगो नोह

1
{}चर्चा: stackoverflow.com/questions/17589533/… memset स्पष्ट रूप से सही नहीं है: मुझे लगता है कि यह केवल 0 के लिए काम करता है: stackoverflow.com/questions/11138188/…
Ciro Santilli 郝海东 病 六四 事件

1
यदि यह संरचना का एक सरणी है, और -Werror=missing-bracesgcc में इसका उपयोग किया जा रहा है, तो इसे आरंभिक किया जाना चाहिए {{0}}। यदि पहला स्ट्रक्चर एलिमेंट एक अन्य स्ट्रक्चर है तो वगैरह {{{0}}}। देखें stackoverflow.com/questions/5434865/...
टो Klingberg

1
आज मेरा सामना अजीब से हो गया ... int arr[256]={1,2,7,{0}};... जो मुझे यहां ले आया। जब तक मैंने इसे देखा नहीं था तब तक यह आंशिक-शून्यिंग एक चीज़ नहीं थी।
नील गैटेनबी

32

यदि आप 0 से भिन्न मानों को आरम्भ करना चाहते हैं, gccतो आप ऐसा कर सकते हैं:

int array[1024] = { [ 0 ... 1023 ] = -1 };

यह C99 नामित आरंभिकों का GNU विस्तार है । पुराने जीसीसी में, आपको -std=gnu99अपने कोड को संकलित करने के लिए उपयोग करने की आवश्यकता हो सकती है ।


14
C99 में नामित इनिशियलाइज़र मानक हैं। ...किसी श्रेणी को निरूपित करने का उपयोग एक जीसीसी-विशिष्ट विस्तार है।
कीथ थॉम्पसन

1
यह एक C99 नामित इनिशियलाइज़र नहीं है, यह GCC- विशिष्ट रेंज इनिशियलाइज़र है । C99 मानक के बजाय GCC मैनुअल से परामर्श क्यों करें?
क्रेग बार्न्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.