एक संरचना को शुरू करने के लिए 0


116

अगर मेरे पास इस तरह की एक संरचना है:

typedef struct
{
    unsigned char c1;
    unsigned char c2;
} myStruct;

इस संरचना को 0 से आरंभ करने का सबसे आसान तरीका क्या होगा? निम्नलिखित पर्याप्त होगा?

myStruct _m1 = {0};

या क्या मुझे प्रत्येक सदस्य को 0 में स्पष्ट रूप से सम्मिलित करने की आवश्यकता होगी?

myStruct _m2 = {0,0};

जवाबों:


142

पहला सबसे आसान ( कम टाइपिंग शामिल है ), और यह काम करने की गारंटी है, सभी सदस्यों को 0[Ref 1] पर सेट किया जाएगा ।
दूसरा अधिक पठनीय है।

चुनाव उपयोगकर्ता वरीयता या आपके कोडिंग मानक जनादेश पर निर्भर करता है।

[संदर्भ 1] संदर्भ C99 मानक ६..2.1.२१:

अगर किसी ब्रेस-एनक्लोजर सूची में कम इनिशियलाइज़र हैं, तो एग्रीगेट के तत्व या सदस्य हैं, या किसी स्ट्रिंग लिटरल में कम कैरेक्टर हैं, जो एरे में एलीमेंट्स हैं, एग्रीगेट के बचे हुए हिस्से की तुलना में किसी ज्ञात साइज़ की एक ऐरे को इम्प्लीमेंट करने के लिए इस्तेमाल करते हैं। स्थैतिक रूप से वैसा ही हो जैसा कि स्थिर भंडारण अवधि है।

अच्छा पढ़ें:
सी और सी ++: स्वचालित संरचना का आंशिक प्रारंभिककरण


9
इसके अलावा, मैं उपयोग कर = {};रहा हूं लेकिन मुझे यकीन नहीं है कि यह वैध है।
विलियम एंट्रीकेन

15
@FullDecent आरंभीकरण के लिए खाली ब्रेसिज़ एक GNU एक्सटेंशन है।
a3f

2
@ alias65536 इस सवाल का टैग C C ++ नहीं है।
a3f

3
मुझे एक त्रुटि मिली: "इनिशलाइज़र के आसपास लापता ब्रेसिज़ [-वर = लापता-ब्रेसिज़]" शायद एक सदस्य सरणी के कारण: /
DrumM

3
@Edenia। मैं असहमत हूं। मुझे पहले से ही पता है कि foo = {0}इसका क्या मतलब है। अगर मैंने देखा foo = ZERO_FULL, तो मुझे ZERO_FULL की परिभाषा के लिए grep करना होगा।
एंड्रयू बैनब्रिज

32

यदि डेटा एक स्थिर या वैश्विक चर है, तो यह डिफ़ॉल्ट रूप से शून्य-भरा है, इसलिए इसे घोषित करें myStruct _m;

यदि डेटा एक स्थानीय चर या ढेर-आवंटित क्षेत्र है, तो इसे इस memsetतरह से साफ़ करें :

memset(&m, 0, sizeof(myStruct));

वर्तमान संकलक (जैसे हाल के संस्करण gcc) व्यवहार में काफी अच्छी तरह से अनुकूलन करते हैं। यह तभी काम करता है जब सभी शून्य मान (शून्य बिंदु और फ्लोटिंग पॉइंट शून्य शामिल होते हैं) को सभी शून्य बिट्स के रूप में दर्शाया जाता है, जो कि उन सभी प्लेटफार्मों पर सच है जिनके बारे में मैं जानता हूं (लेकिन सी मानक परमिट कार्यान्वयन जहां यह गलत है; मुझे ऐसा कोई कार्यान्वयन नहीं पता है) ।

आप शायद कोड myStruct m = {};या myStruct m = {0};(भले ही पहले सदस्य myStructएक अदिश राशि नहीं है)।

मेरी भावना यह है कि memsetस्थानीय संरचनाओं के लिए उपयोग करना सबसे अच्छा है, और यह इस तथ्य को बेहतर ढंग से बताता है कि रनटाइम के दौरान कुछ करना पड़ता है (आमतौर पर, वैश्विक और स्थैतिक डेटा को संकलित समय पर आरंभीकृत किया जा सकता है, बिना किसी लागत के) ।


7
इस बात की कोई गारंटी नहीं है कि संरचना के सभी बाइट्स को सेट 0करना सभी संरचनात्मक सदस्यों को शुरू करने के बराबर होगा 0। कई प्लेटफार्मों पर यह सच होगा, लेकिन सार्वभौमिक रूप से नहीं।
सैंडर डी डाइकर

1
क्या आप एक उदाहरण साझा कर सकते हैं, सैंडर? वास्तविक जिज्ञासा। (जाहिर है, सार्वभौमिक रूप से सच नहीं है, इसका मतलब यह नहीं है कि एक आसान-से-समझाने वाला अपवाद है, लेकिन अगर वहाँ है ...)
स्टीवन फिशर

2
सी मानक नल पॉइंटर परमिट (या एक शून्य चल बिन्दु संख्या) सभी शून्य बिट्स से कुछ और से स्मृति में प्रतिनिधित्व करने की। बहुत कम और अजीब कार्यान्वयन कर रहे हैं (मैं किसी का नाम नहीं ले सकता)।
बेसिल स्टारीनेवविच

-1, आपको वह इनिशियलाइज़ेशन मिल सकता है जो ओपी बदसूरत के बारे में पूछता है, लेकिन यह वही है जो मानक द्वारा अनदेखा किया जाता है और जिसे आसानी से सभी कंपाइलरों द्वारा अनुकूलित किया जा सकता है। फिर, फॉर्म {}सी मान्य नहीं है, लेकिन केवल सी ++ में उपलब्ध है।
जेन्स गुस्ताद

7
@ सीन: मैं केवल अस्पष्ट और / या पुराने प्लेटफार्मों के बारे में सोच सकता हूं। C FAQ में उन प्लेटफार्मों की एक सूची होती है, जिनके पास एक NULLसंकेतक था जो सभी 0बिट्स नहीं थे : c-faq.com/null/machexamp.html । और फिर संभावना है कि फ़्लोटिंग पॉइंट मानों का प्रतिनिधित्व करने के लिए प्लेटफ़ॉर्म IEEE 754 का उपयोग नहीं कर रहा है, लेकिन कुछ अन्य प्रतिनिधित्व का उपयोग करता है जिसमें सभी 0बिट 0.0मान नहीं हैं - लेकिन माना जाता है कि मुझे ऐसे किसी प्लेटफ़ॉर्म का पता नहीं है।
Sander De Dycker

19

देखें §6.7.9 प्रारंभिक:

21 अगर किसी ब्रेस-एनक्लोजर सूची में कम इनिशियलाइज़र होते हैं, तो एग्रीगेट के तत्व या सदस्य होते हैं, या एक स्ट्रिंग लिटरल में कम वर्णों का उपयोग किया जाता है, जिससे ज्ञात साइज़ की एक ऐरे को ऐरिअलीज़ किया जा सके, जहाँ एरे में एलीमेंट्स हैं, एग्रीगेट के शेष भाग स्थैतिक रूप से वैसा ही इनिशियलाइज़ किया जाना चाहिए, जिसमें स्टैटिक स्टोरेज की अवधि हो।

तो, हाँ दोनों काम करते हैं। ध्यान दें कि C99 में आरंभीकरण का एक नया तरीका, जिसे नामित आरंभीकरण कहा जाता है, का भी उपयोग किया जा सकता है:

myStruct _m1 = {.c2 = 0, .c1 = 1};

सबसे विशेष रूप से यह पहले से ही C89 है: open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf#page=139 (विशिष्ट सिग्नल प्रोसेसिंग लक्ष्य के लिए महत्वपूर्ण)
टोबीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.