2009-04-10 4 views
47

मैं कुछ वर्षों से सी ++ का उपयोग कर रहा हूं, और आज मैंने कुछ कोड देखा, लेकिन यह पूरी तरह कानूनी कैसे हो सकता है?गतिशील आवंटन के बिना रन टाइम पर ऐरे आकार की अनुमति है?

int main(int argc, char **argv) 
{ 
    size_t size; 
    cin >> size; 
    int array[size]; 
    for(size_t i = 0; i < size; i++) 
    { 
     array[i] = i; 
     cout << i << endl; 
    } 

    return 0; 
} 

जीसीसी के तहत संकलित।

आकार new या malloc के बिना रन-टाइम पर आकार कैसे निर्धारित किया जा सकता है?

बस दोबारा जांच करने के लिए, मैंने कुछ और सभी समान कोडों को गुमराह किया है, भंडारण आकार त्रुटि देने का दावा किया जाता है।

यहां तक ​​कि डीटेल का सी ++ कार्यक्रम कैसे करें पी। सामान्य प्रोग्रामिंग त्रुटि के तहत 261 राज्य 4.5:

केवल स्थिरांक का उपयोग स्वचालित और स्थैतिक सरणी के आकार की घोषणा करने के लिए किया जा सकता है।

मुझे प्रकाशित करें।

+2

ध्यान दें कि डीएमए "प्रत्यक्ष स्मृति पहुँच" का अर्थ है - मुझे लगता है कि आप गतिशील आवंटन –

+2

सी या सी ++ के बारे में पूछ रहे हैं? एक चुनें_। –

+1

फिर से, एक चुनें: सी या सी ++। यह सवाल स्पष्ट रूप से और केवल सी के बारे में है; एक सी ++ टैग नहीं होना चाहिए। –

उत्तर

49

यह सी 99 में मान्य है।

सी 99 मानक ढेर पर परिवर्तनीय आकार के सरणी का समर्थन करता है। शायद आपके कंपाइलर ने भी इस निर्माण का समर्थन करना चुना है।

ध्यान दें कि यह malloc और new से अलग है। gcc स्टैक पर सरणी आवंटित करता है, जैसे कि यह स्टैक पॉइंटर को समायोजित करके int array[100] के साथ करता है। कोई ढेर आवंटन नहीं किया जाता है। यह _alloca की तरह काफी है।

+7

मैं इस कोड में हमारे कोड बेस में एक फ़ाइल में आया था जो महीने पहले लिखा गया था।मैं परेशान था, जैसा कि बाकी टीम था, क्यों इसे संकलित किया गया था। हमारी स्थिति में, सरणी का आकार सरणी घोषित करने से पहले गणना की गई थी (जिसे अनुमति नहीं दी जानी चाहिए?) वैसे भी, एक चुनौती समाप्त हो गई। कोई भी जो उत्तर दे सकता है कि यह कानूनी क्यों है, वह पॉप टर्ट प्राप्त करता है। यदि आप कभी भी सिएटल में हैं, तो मुझे बताएं। मेरे पास तुम्हारे लिए एक पॉप टार्ट है। –

+0

क्या आप इस मामले में आंतरिक रूप से कैसे काम करते हैं इस बारे में कुछ जानकारी/लिंक प्रदान कर सकते हैं? क्या यह रन टाइम में कुछ ओवरहेड पेश करता है? – balki

+1

@balki ओवरहेड नाबालिग है, क्योंकि यह मूल रूप से स्टैक पॉइंटर में वृद्धि/कमी कर रहा है। यदि आप फ़ंक्शन की शुरुआत में मूल स्टैक पॉइंटर को सहेजते हैं तो स्टैक व्यवहार सामान्य रूप से सामान्य स्थिति के समान हो सकता है। –

7

यह केवल C12 में valid है। अगली बार जब आप reliable compiler में अपना कोड जांचने का प्रयास कर सकते हैं।

4

यह मान्य सी 99 है, यह वैध सी ++ मान्य नहीं है। यह दो भाषाओं के बीच कुछ मतभेदों में से एक नहीं है।

+2

मुझे लगता है कि इसे सी ++ 0x –

+0

में समर्थित किया जा रहा है ड्राफ्ट मानक की धारा 8.3.4 के अनुसार नहीं। –

+2

इसे कभी भी सी ++ 1x में शामिल नहीं किया जाएगा: डी लेकिन उम्मीद है कि dynarray अंदर आ जाएगा। मुझे यह पसंद आएगा। तो आप dynarray a (some_size) कर सकते हैं; और इसे कुशलता से आवंटित किया गया है, संभवतः कंपाइलर हैक्स जैसे _alloca और इसी तरह के साथ। –

18

इसे वीएलए (परिवर्तनीय लंबाई सरणी) के रूप में जाना जाता है। यह सी 99 में मानक है, लेकिन जीसीसी इसे सी ++ कोड में एक्सटेंशन के रूप में अनुमति देता है। यदि आप कोड को अस्वीकार करना चाहते हैं, तो -std=standard, -ansi और -pedantic विकल्पों के साथ प्रयोग करने का प्रयास करें।

0

यदि आप देव-सीपीपी कंपाइलर का उपयोग कर रहे हैं तो आप गतिशील रूप से सरणी को आकार दे सकते हैं मैंने इसे पर आज़माया है और दृश्य सी ++ और विजुअल स्टूडियो कंपाइलर्स पर कोई त्रुटि नहीं है, लेकिन यह संभव नहीं है। मुझे लगता है कि कारण यह है कि dev-C++ uninitialized int पर एक सकारात्मक संख्या निर्दिष्ट करता है और जब हम इसे एक संख्या देते हैं तो इसे किसी दिए गए स्थान से प्रतिस्थापित किया जाता है। लेकिन शायद अन्य कंपाइलर अनियमित चर के लिए शून्य देते हैं।

+0

अधिकांश कंपाइलर अनियमित स्थानीय चरों को कुछ भी निर्दिष्ट नहीं करते हैं, वे आम तौर पर प्रोग्राम द्वारा असाइन किए जाने तक स्मृति में जो कुछ भी रखते हैं, उसे पकड़ने लगते हैं। ऐसा लगता है कि आपने जिस देव-सी ++ का संदर्भ दिया है वह मिनीजीडब्लू के शीर्ष पर एक आईडीई है, जिसमें संकलक के रूप में जीसीसी का एक बंदरगाह शामिल है। जैसा कि अन्य उत्तरों में उल्लेख किया गया है, वीएलए मानक सी ++ नहीं हैं, लेकिन कुछ कंपाइलर्स (जी ++ समेत) उन्हें वैसे भी समर्थन देते हैं। – jerry

+0

देव-सी ++ एक कंपाइलर नहीं है। न तो विजुअल स्टूडियो है। देव-सी ++ अपने कंपाइलर के रूप में जीसीसी/जी ++ का उपयोग करता है, जबकि विजुअल स्टूडियो सीएल (माइक्रोसॉफ्ट के कंपाइलर बैक-एंड) का उपयोग करता है। अपने आप से, देव-सी ++ और विजुअल स्टूडियो एकीकृत विकास वातावरण (आईडीई) हैं। यह बनाने के लिए एक महत्वपूर्ण भेद है। देव-सी ++ कुछ भी "असाइन नहीं" करता है। संकलक ऐसा करता है। – Elkvis

-1

परिवर्तनीय लंबाई Arrays (VLAs) को C++ 14 मानक में समर्थित किया गया है, जिसे हाल ही में स्वीकार कर लिया गया है, और प्रकाशन का इंतजार कर रहा है।

+1

वीएलए अभी भी मानक का हिस्सा नहीं हैं। एक [dynarray] (http://en.cppreference.com/w/cpp/container/dynarray) टीएस है, लेकिन अभी तक यह पुष्टि नहीं है। – Jason

0

यह कोड जीएनयू जीसीसी कंपाइलर में चलता है।

#include<bits/stdc++.h> 

int main(int argc, char **argv) 

{ 
    size_t size; 

    std:: cin >> size; 

    int array[size]; 

    for(size_t i = 0; i < size; i++) 

{ 

array[i] = i; 

     std:: cout << i; 

} 

    return 0; 
} 
संबंधित मुद्दे