चूंकि आपके द्वारा घोषित सरणी का आकार स्थिर नहीं है, आपके पास परिवर्तनीय लंबाई ऐरे (VLA) है। वीएलए मानक द्वारा वीएलए की अनुमति है लेकिन इसके साथ जुड़े कुछ सीमाएं हैं। आपके पास static
या extern
स्टोरेज क्लास विनिर्देशक के साथ एक चर लंबाई लंबाई सरणी नहीं हो सकती है।
आपके पास static
संग्रहण विनिर्देश के साथ एक वीएलए है और इसे C99 मानक द्वारा अनुमति नहीं है।
संदर्भ:
c99 मानक: 6.7.5.2/8
उदाहरण 4 variably फाई एड मोदी की सभी घोषणाओं (VM) प्रकार या तो ब्लॉक गुंजाइश या समारोह प्रोटोटाइप दायरे में रहना होगा। स्थिर या बाहरी स्टोरेज क्लास के साथ घोषित ऐरे ऑब्जेक्ट्स में एक चर लंबाई लंबाई (VLA) प्रकार नहीं हो सकता है। हालांकि, स्थैतिक भंडारण वर्ग विशिष्टता के साथ घोषित एक वस्तु में वीएम प्रकार हो सकता है (यानी, एक वीएलए प्रकार के लिए सूचक)। अंत में, वीएम प्रकार के साथ घोषित सभी पहचानकर्ताओं को सामान्य पहचानकर्ता होना चाहिए और इसलिए, संरचनाओं या संघों के सदस्य नहीं हो सकते हैं।
तो यदि आप static
संग्रहण विनिर्देशक के साथ गतिशील आकार सरणी चाहते हैं तो आपको ढेर पर आवंटित गतिशील सरणी का उपयोग करना होगा।
#define MAX_SIZE 256
static int* gArr;
gArr = malloc(MAX_SIZE * sizeof(int));
संपादित करें:
अपने अपडेट किए गए सवाल का जवाब करने के लिए:
जब आप घोषणा से static
कीवर्ड निकालने, वैश्विक को static
से घोषित सरणी परिवर्तन का भंडारण विनिर्देशक, ऊपर मानक बोली ध्यान दें, यह स्पष्ट रूप से प्रतिबंध का उल्लेख करता है कि वीएलए को static
और extern
संग्रहण विनिर्देश के साथ अनुमति नहीं है। जाहिर है, आपको ग्लोबल स्टोरेज विनिर्देश के साथ एक वीएलए रखने की अनुमति है, जो आपके पास static
कीवर्ड को हटाने के बाद आपके पास है।
स्रोत
2012-05-20 18:04:55
अच्छी तरह से शोध किए गए उत्तर के लिए धन्यवाद। – Abhinav
तो प्रभावी रूप से, यदि मैं जीसीसी-4.3 का उपयोग कर रहा हूं, तो वीएलए को बाहरी और स्थैतिक प्रकार चर के लिए अनुमति नहीं है? यह वही है जो उपयोगकर्ता डीकोडर ने एक और जवाब में एक टिप्पणी में जवाब दिया है। – Abhinav
@ अहिनाव: हाँ, आप सही हैं। 'बाहरी' और 'स्थैतिक' प्रकार भंडारण विनिर्देश के साथ चर के लिए वीएलए की अनुमति नहीं है। आप gcc-4.3 का उपयोग कर रहे हैं जो c99 मानक को comlies। आपके द्वारा संपादित क्वेरी को संबोधित करने के उत्तर का अद्यतन किया गया। –