2013-07-09 6 views
5

मैं सी 99 में प्रोग्रामिंग कर रहा हूं और मेरे कोड के एक हिस्से में परिवर्तनीय लंबाई सरणी का उपयोग करता हूं। मुझे पता है कि सी 8 9 शून्य-लंबाई वाले सरणी की अनुमति नहीं है, लेकिन मुझे सी 99 और परिवर्तनीय लंबाई सरणी की अनिश्चितता है।शून्य-लंबाई परिवर्तनीय लंबाई सरणी अनुमति/अच्छी तरह से परिभाषित हैं?

संक्षेप में, निम्नलिखित अच्छी तरह से परिभाषित व्यवहार है?

int main() 
{ 
    int i = 0; 
    char array[i]; 
    return 0; 
} 
+0

यह संकलन भी नहीं करना चाहिए, क्योंकि 'i' संकलन-समय स्थिर नहीं है। – Jashaszun

+1

इसे संकलित करने का प्रयास करें; जीसीसी बाहर आ जाएगा, आपको पंच करेगा, आपको गोली मार देगा और आपकी कार चुराएगा। –

+4

[दोस्तों ...यह सी 99 है ... सी 8 9 नहीं।] (http://ideone.com/NKtfJD) – Cornstalks

उत्तर

13

नहीं है, शून्य लंबाई सरणियों स्पष्ट रूप से सी भाषा द्वारा अनुमति नहीं है, (अपने कोड नमूना के रूप में), भले ही वे एक रन-टाइम आकार मूल्य के माध्यम से VLA के रूप में बनाया जाता है।

6.7.5.2 सरणी

...

declarators आकार एक अभिव्यक्ति है कि एक पूर्णांक लगातार अभिव्यक्ति नहीं होता है: यह समारोह में एक घोषणा में होता है, तो प्रोटोटाइप स्कोप, यह माना जाता है कि इसे * द्वारा प्रतिस्थापित किया गया था; अन्यथा, प्रत्येक बार यह मूल्यांकन किया गया है, इसका मूल्यांकन शून्य से से अधिक होगा।

+0

ओयूओ, याय, मानक से उद्धरण। मुझे वो पसंद है। +1! – Cornstalks

2

शून्य लंबाई सरणियों सी में अनुमति नहीं है statically टाइप सरणियों एक निश्चित, गैर शून्य आकार एक निरंतर अभिव्यक्ति है कि होना चाहिए, और चर लंबाई-सरणियों एक आकार जो मूल्यांकन करता है गैर शून्य होनी चाहिए; सी 11 6.7.6.2/5:

हर बार [आकार अभिव्यक्ति] मूल्यांकन किया जाता है यह शून्य से अधिक

हालांकि एक मूल्य होगा, C99 और C11 एक लचीला सरणी की एक धारणा है एक struct के सदस्य:

struct foo 
{ 
    int a; 
    int data[]; 
}; 

सी 11 से, 6.7.21/18:

एक विशेष मामले के रूप में, एक से अधिक नाम वाले सदस्य के साथ संरचना का अंतिम तत्व में अपूर्ण सरणी प्रकार हो सकता है; इसे लचीला सरणी सदस्य कहा जाता है। ज्यादातर स्थितियों में, लचीला सरणी सदस्य को अनदेखा किया जाता है। विशेष रूप से, संरचना का आकार ऐसा लगता है कि लचीला सरणी सदस्य छोड़ा गया था, सिवाय इसके कि से अधिक पिछला पैडिंग हो सकता है, तो चूक का अर्थ होगा। हालांकि, जब . (या ->) ऑपरेटर के पास बाएं ऑपरेंड है जो (एक पॉइंटर) है जो एक लचीली सरणी सदस्य और दाएं ऑपरेंड नामों के साथ सदस्य है, तो ऐसा लगता है कि उस सदस्य को सबसे लंबे सरणी के साथ बदल दिया गया था (उसी तत्व प्रकार के साथ) जो ऑब्जेक्ट तक पहुंचने से संरचना को बड़ा नहीं बनायेगा;

+0

लचीला सरणी सदस्य के बारे में नोट के लिए धन्यवाद। मानक से वह उद्धरण वास्तव में उपयोगी था! – Cornstalks

1

मानक सी में शून्य-लंबाई सरणी की अनुमति नहीं है (यहां तक ​​कि सी 99 या सी 11 भी नहीं)। लेकिन जीसीसी इसे अनुमति देने के लिए एक विस्तार प्रदान करता है। http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

struct line { 
    int length; 
    char contents[0]; 
}; 

struct line *thisline = (struct line *) 
    malloc (sizeof (struct line) + this_length); 
thisline->length = this_length; 
संबंधित मुद्दे