2011-09-15 9 views
9

विजुअल स्टूडियो 2010 में, यह प्रारंभिक अपेक्षा के अनुसार काम करता है:बहु-आयामी सरणी प्रारंभ करते समय मैं आयामों को पूरी तरह से क्यों नहीं छोड़ सकता?

char table[2][2] = { 
         {'a', 'b'}, 
         {'c', 'd'} 
        }; 

लेकिन ऐसा कुछ लिखने के लिए कानूनी प्रतीत नहीं होता है:

char table[][] = { 
        {'a', 'b'}, 
        {'c', 'd'} 
       }; 

विजुअल स्टूडियो शिकायत करता है कि इस सरणी में 'तत्व' 'टाइप करें, और संकलन के बाद, वीएस दो त्रुटियों की रिपोर्ट करता है: एक लापता सूचकांक और बहुत से प्रारंभिकरण।

प्रश्न: बहु-आयामी सरणी प्रारंभ करते समय मैं आयामों को पूरी तरह से क्यों नहीं छोड़ सकता?

उत्तर

12

केवल सबसे कम आयाम छोड़ा जा सकता है। सरणी चर के लिए दिए गए प्रकार के लिए सरणी में तत्वों का आकार घटाया जाता है। इसलिए तत्वों के प्रकार को ज्ञात आकार होना चाहिए।

  • char a[]; तत्व है (उदाहरण के लिए a[0]) आकार 1 (8 बिट) के , और एक अज्ञात आकार की है।
  • char a[6]; आकार 1 के तत्वों है, और (जो एक सरणी है जैसे a[0],) आकार की है 6.
  • char a[][6]; तत्व है आकार 6 की , और एक अज्ञात आकार की है।
  • char a[10][6]; आकार 6. के तत्वों है और आकार 60.

की अनुमति नहीं है:

  • char a[10][]; अज्ञात आकार के 10 तत्वों होगा।
  • char a[][]; अज्ञात आकार के तत्वों की अज्ञात संख्या होगी।

तत्वों का आकार अनिवार्य है, संकलक को तत्वों (पॉइंटर अंकगणितीय के माध्यम से) तक पहुंचने की आवश्यकता होती है।

+6

दूसरे शब्दों में, जबकि सरणी का आकार स्वयं अज्ञात हो सकता है, तत्वों का आकार अज्ञात नहीं हो सकता है? –

+0

@ मिरोस्लाव: बिल्कुल! –

+0

आह, ठीक है, इस जानकारी के लिए धन्यवाद। आगे विचार पर, यह केवल तार्किक लगता है, जैसा कि यह हमेशा करता है, है ना? ;-) –

0

क्या यह एक स्वीकार्य काम है?

char * table [] = { "ab", "cd" }; 

संपादित करें: ध्यान दें कि यह प्रत्येक स्ट्रिंग के अंत में एक अतिरिक्त '\ 0' जोड़ देगा।

+0

यह एक अच्छा समाधान है। लेकिन वह उत्तर नहीं जिसे मैं ढूंढ रहा था। फिर भी, मुझे एक शांत चाल दिखाने के लिए धन्यवाद। :-) –

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