2010-10-07 8 views
9
struct mystruct s[10] = {{0}}; 

यह structs की एक सरणी को 0 से शुरू करने के लिए प्रतीत होता है। नेस्टेड ब्रेसिज़ सिंटैक्स कैसे काम करता है?सी: संरचना प्रारंभिकरण की सरणी के लिए नेस्टेड ब्रेसिज़ कैसे काम करता है?

+1

+1 एक ऐसे प्रश्न के लिए जो कई चीजों को दिखाता है जो लोगों को सी –

उत्तर

9

निर्दिष्ट फ़ील्ड शून्य से शुरू नहीं किए गए हैं। तो यहां आपके पास structs की एक सरणी है। आप सरणी के पहले तत्व को प्रारंभिक प्रारंभकर्ता के साथ प्रारंभ कर रहे हैं जो संरचना के पहले तत्व को शून्य में प्रारंभ करता है। बाकी की पहली संरचना और शेष सरणी तत्व सभी शून्य भी होंगे। यह एक अच्छा मुहावरे है।

+0

के बारे में समझने की ज़रूरत नहीं है बस यह सुनिश्चित करने के लिए कि मैं इसे सही ढंग से समझ रहा हूं। चूंकि सभी गैर-निर्दिष्ट फ़ील्ड शून्य में प्रारंभ किए गए हैं, इसलिए '= {{0}} 'का कोई प्रभाव नहीं पड़ता है? –

+2

इसका असर पड़ता है। यह विशेष रूप से पहले तत्व को शून्य में प्रारंभ करता है, और उसके बाद शेष तत्वों को शून्य पर प्रारंभिक रूप से प्रारंभ करता है। यदि आपने {{0}} छोड़ा है, तो आपको यादृच्छिक कचरा मिल जाएगा यदि आपने इसे किसी फ़ंक्शन (स्टैक पर) के अंदर घोषित किया है। (ध्यान दें कि यदि आप इसे वैश्विक मानते हैं और {{0}} को छोड़ देते हैं, तो इसे शून्य में भी शुरू किया जाएगा, लेकिन विभिन्न कारणों से।) – xscott

3

यह प्रारंभिक ब्रेसिज़ नहीं है जो प्रारंभ होता है। बाहरी ब्रेसिज़ संकेत कर रहे हैं कि एक सरणी प्रारंभ किया जा रहा है:

struct mystruct s[10] = {   }; 

इस के बाद से संरचनाओं की एक सरणी है, प्रत्येक संरचनाओं आगे कोष्ठक प्रारंभ किया जा सकता है:

struct mystruct { int x, y, z}; 

struct mystruct s[10] = { {0, 1, 2}, // <-- initializes s[0].x, s[0].y, s[0].z 
          {1, 2, 3}, // <-- initializes s[1].x, s[1].y, s[1].z 
          {2, 3, 4} // <-- initializes s[2].x, s[2].y, s[2].z 
}; 

सूचना है कि केवल पहले तीन तत्व हैं प्रारंभ। सी मानक के अनुसार शेष 7 तत्वों को 0 से शुरू किया जाना चाहिए। यह आपके कोड के साथ भी होता है। चूंकि xscott ने अपने उत्तर में उल्लेख किया है, प्रारंभकर्ता सूची में छोड़ी गई सभी चीज़ों को 0

3

दिखाया गया है?

असल में, आपको प्रत्येक कंपाउंड प्रकार - सरणी, संरचना, आदि को अपने ब्रेसिज़ के स्तर के अंदर संलग्न करना चाहिए।

पर विचार करें:

struct mystruct 
{ 
    int i; 
    double d; 
    char s[10]; 
    int a[5]; 
} s[10] = 
{ 
     { 0, 0.0, "abc", { 1, 2, 3, 4, 5 } }, 
     { 1, 1.0, "def", { 2, 3   } }, // Partially initialized array 
     { 2, 2.0, { 'x', 'y', 'z' }, { 0 } }, // Strings are a shorthand 
[9] = { 9, 99, 0,  { 9, 8, 7, 6, 5 } }, // C99 - initialize row 9 
}; 

लेकिन अगर आप जोर देते हैं (बुरा, पुरातन अभ्यास) आप भी ब्रेसिज़ छोड़ सकते हैं:

struct mystruct t[3] = 
{ // You cannot avoid using these outside braces 
    0, 0.00, "abc", 1, 2, 3, 4, 5, // Omitted braces 
    1, 1.11, "bcd", 2, 3, 4, 5, 4, 
    2, 2.34,      // Omitted values 
}; 

किसी भी छोड़े गए initializers शून्य माना जाता है।

+0

ब्रेसिज़ का उपयोग करने के लाभ पर यह आपको भागों के प्रारंभिकरण को छोड़ने देता है बाद के सदस्यों को शुरू करने के दौरान जारी रखने के दौरान कुछ सदस्यों (जिसे तत्काल शून्य में प्रारंभ किया जाएगा)। '{'X', 'y', 'z'} का उपयोग, 'इसका एक उदाहरण है। –

0

यह ध्यान रखना उपयोगी है कि आंतरिक ब्रेसिज़ वैकल्पिक होने पर, कंपाइलर यह सुनिश्चित करने के लिए जांच करेगा कि उद्घाटन ब्रेसिज़ केवल तब दिखाई दें जहां उन्हें चाहिए, और कोई नेस्टेड आइटम में बहुत से प्रारंभकर्ता नहीं हैं। इसके अलावा, कोई संरचना के कुछ फ़ील्ड छोड़ सकता है और संकलक स्वचालित रूप से उन्हें शून्य कर देता है, भले ही संरचना सरणी के अंत में न हो। ध्यान दें कि कार्यान्वयन इसे संभालने की उनकी दक्षता में भिन्न होता है; कुछ प्रारंभिक रिकॉर्ड को छोटे टुकड़ों में विभाजित करेंगे, जबकि अन्य कोड में बहुत सारे शून्य डालेंगे। उदाहरण के लिए, यदि प्रत्येक struct देखा की तरह:

 
typedef struct { 
    char name[8]; 
    char more_stuff[1016]; 
} THINGIE; 
THINGIE my_array = {{"Fred"},{"George"},{"Mark"}}; 

कुछ compilers, स्थिरांक डेटा की 3K लायक उत्पन्न करते हैं जबकि अन्य तीन अपेक्षाकृत छोटे 'स्थिरांक-init' रिकॉर्ड उत्पन्न होगा।

+0

कंपाइलर यह नहीं देख सकता कि उद्घाटन ब्रेसिज़ केवल तब दिखाई दें जहां उन्हें "चाहिए", क्योंकि वे कहीं भी मान्य हैं। यहां तक ​​कि यह वैध सी है: 'int x = {0};'। –

+0

आपने अपनी स्ट्रक्चर परिभाषा से पहले "टाइपपीफ" कीवर्ड छोड़ा था। उपरोक्त आपके कोड में, THINGIE एक चर है, एक प्रकार नहीं। – xscott

+0

@ आर: सच; जहां आप सत्यापन प्राप्त करते हैं, यदि आप दो या दो से अधिक चीजों को ब्रेस में डालने का प्रयास करते हैं। मुझे पूरा यकीन है "int x = {0,1};" कानूनी नहीं है – supercat

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