2016-11-14 7 views
23

सी कोड में मैं विश्लेषण कर रहा हूं, वहां कई बहुआयामी (संरचना) सरणी हैं जिन्हें घुमावदार ब्रैकेट्स की एक अलग संख्या के साथ प्रारंभ किया गया है। {{0}} या {{{0}}}एक बहुआयामी सरणी शुरू करना: {0} बनाम {{{0}}}

हालांकि, {0} द्वारा इन्हें प्रतिस्थापित करने से भी पूरी तरह से काम करता है।

घुंघराले ब्रैकेट्स ({}) घटनाओं के एक या अधिक सेटों का उपयोग करने के बीच कोई (कार्यात्मक) अंतर है?

+4

[एक मूल्य के साथ पूरे 2 डी सरणी को शुरू करना] (http://stackoverflow.com/questions/15520880/initializing-entire-2d-array-with-one-value) का जवाब देना चाहिए कि क्यों {{0} 'काम करता है। – Lundin

उत्तर

13

नहीं, कोई कार्यात्मक अंतर नहीं है। सी मानक इंटरमीडिएट {} छोड़ने की अनुमति देता है। विशेष रूप से, फॉर्म { 0 } एक प्रारंभकर्ता है जिसका उपयोग सभी डेटा प्रकारों के लिए किया जा सकता है।

8

आपके पास दो विकल्प हैं: या तो { 0 }, जो कि किसी भी कुल या संघ प्रकार के लिए काम करता है और शून्य प्रत्येक सदस्य को प्रारंभ करता है, या सही फॉर्म का उपयोग करता है जो सभी सदस्यों के साथ सही ढंग से मेल खाना चाहिए।

+4

संख्या '{0} 'स्केलर प्रकारों के लिए भी काम करता है। '{0}' और '{{{0}}} के बीच कोई अंतर नहीं है। –

+1

आपने कहा "किसी भी कुल या संघ प्रकार के लिए काम करता है"। क्या ऐसा नहीं है? –

+3

@ पीपी। '{0}' स्केलर प्रकारों के लिए काम करता है, लेकिन मैंने कभी नहीं कहा कि यह नहीं करता है। – 2501

3

जेन्स ने जो पहले ही कहा है, उसे दोहराने के लिए, {0} किसी भी प्रकार के लिए काम करता है। सी में यह "सार्वभौमिक शून्य प्रारंभकर्ता" है C11 ड्राफ्ट, 6.7.9 Initialization देखें।

तो, 3 डी सरणी शुरू करने के लिए या तो {0} या {{{0}}} का उपयोग किया जा सकता है। व्यक्तिगत रूप से मैं {0} का उपयोग करता हूं क्योंकि यह टाइप करना और पढ़ना आसान है और हर प्रकार के लिए काम करता है। इसका मतलब है, अनुसरण कर रहे हैं सभी वैध initializations:

int main(void) 
{ 
    int x = {0,}; 
    int *p = {0,}; 
    int *q = {0}; 
    int arr[3][3][3][3] = {0}; 
} 

इससे भी महत्वपूर्ण बात, यदि आप एक तीसरे पक्ष के पुस्तकालयों, तो केवल पोर्टेबल रास्ता प्रारंभ करने में उन्हें है से उदाहरण के लिए, किसी अज्ञात/अपारदर्शी प्रकार है के लिए हो {0} का उपयोग कर। इसे शून्य करने का कोई अन्य तरीका (जैसे memset() या सीधे some_type_t state = 0;) का उपयोग करने वाले प्रकार के कुछ आंतरिक ज्ञान और गैर-पोर्टेबल होने का जोखिम आवश्यक होगा।

+3

यदि आपके पास किसी अन्य लाइब्रेरी से अपारदर्शी प्रकार है, तो आपको पहले अपने आंतरिक में हस्तक्षेप नहीं करना चाहिए, लेकिन उस लाइब्रेरी को इसे आरंभ करना चाहिए। – Lundin

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