2009-03-30 9 views
6

मेरी समझ हमेशा यह रही है कि जब मैं एक चर या पैरामीटर के रूप में आने वाले आकार के साथ स्टैक पर एक सरणी घोषित करता हूं, तो मुझे एक त्रुटि मिलनी चाहिए।परिवर्तनीय आकार के साथ सी सरणी घोषित करते समय मुझे संकलन त्रुटि क्यों नहीं मिल रही है?

हालांकि, मैंने देखा कि अगर मुझे स्पष्ट रूप से सरणी शुरू नहीं होती है तो मुझे कोई त्रुटि नहीं मिलती है (हाँ, यह ढेर पर नहीं होगा, लेकिन मैं त्रुटि की कमी के बारे में सोच रहा हूं)। उदाहरण के लिए, निम्न कोड array2 की वजह से संकलित करता है नहीं:

#define N 30 

void defineArrays(int n) 
{ 
    int i,j; 
    int array1[N] = {}; 

    int array2[n] = {}; 

    for(i=0; i<N; ++i) array1[i] = 0; 

    for(j=0; j<n; ++j) array2[j] = 0; 
} 

लेकिन निम्नलिखित कोड रन संकलित करता है तथा, तब भी जब मैं मुख्य रूप से एक असली n भेजें:

#define N 30 

void defineArrays(int n) 
{ 
    int i,j; 
    int array1[N] = {}; 

    int array2[n]; 

    for(i=0; i<N; ++i) array1[i] = 0; 

    for(j=0; j<n; ++j) array2[j] = 0; 
} 

मैं क्या याद आ रही है यहाँ? क्या यह एक सूचक के रूप में array2 घोषित कर रहा है? मैं जीसीसी

अद्यतन का उपयोग कर रहा हूं: उत्तर देने वाले सभी के लिए धन्यवाद। समस्या वास्तव में थी कि जीसीसी का मेरा संस्करण कुछ अजीब कारणों के लिए सी 99 में डिफ़ॉल्ट था (या बहुत अजीब नहीं, शायद मैं बहुत पुराना हूं), और मैंने गलत तरीके से माना कि यह C90 तक डिफ़ॉल्ट है जब तक कि मैं इसे अन्यथा नहीं बताता।

उत्तर

14

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

लिंक चर लंबाई सरणियों के बारे में: http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

+0

अरे, मुझे एहसास हुआ कि नहीं किया है जीसीसी चूक अब C99 के लिए। मैं बहुत लंबे समय तक जी ++ का उपयोग कर रहा हूं। आपके कर्सर के कारण – Uri

+0

@Uri No +1 आपके प्रश्न पर। – Alex

3

मुझे लगता है कि आप आप सी मानक संस्करण का चयन करने की जरूरत है।

gcc -fsyntax-only -std=c89 -pedantic -x c - 

<stdin>: In function ‘defineArrays’: 
<stdin>:6: warning: ISO C forbids empty initializer braces 
<stdin>:8: warning: ISO C90 forbids variable length array ‘array2’ 

बनाम

gcc -fsyntax-only -std=c99 -pedantic -x c - 
<stdin>: In function ‘defineArrays’: 
<stdin>:6: warning: ISO C forbids empty initializer braces 
1

एक प्रारंभकर्ता के साथ सरणी की घोषणा सरणी बलों स्थिर होने के लिए (संकलन समय पर बनाए गए) भले ही गुंजाइश समारोह के भीतर है। संकलक संकलन समय पर सरणी को परिभाषित नहीं कर सकता क्योंकि यह तब 'n' के मान को नहीं जानता है।

error: variable-sized object may not be initialized 

मैं कल्पना क्योंकि आप कितना बड़ा n हो जाएगा पता नहीं है इस लिए अनुमति नहीं है, और इसलिए आप नहीं कर सकते:

+0

मैं समझता हूं, लेकिन मैं दूसरे को संकलित क्यों कर सकता हूं? – Uri

1

जब मैं जीसीसी के साथ पहला उदाहरण संकलन है, यह मुझे इस त्रुटि देता है सुनिश्चित करें कि यह उन सभी तत्वों को पकड़ने के लिए पर्याप्त होगा जो आप प्रारंभ करने की कोशिश कर रहे हैं। यही कारण है, अगर आप इस तरह कोड है लगता है:

int array2[n] = { 1, 2, 3, 4 }; 

यह जरूरी है कि array2 (कम से कम) 4 स्लॉट की है। क्या होगा अगर n शून्य के रूप में पारित किया गया है?

दूसरे उदाहरण में यह समस्या नहीं है क्योंकि आप array2 के आकार के बारे में कोई अंतर्निहित बयान नहीं दे रहे हैं।

आशा है कि मदद करता है,

एरिक Melski

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