2017-02-15 21 views
7

के साथ सरणी को परिभाषित करें जैसा कि मैं इसे समझता हूं, जब हम const char argv[SIZE]; "SIZE" जैसे किसी सरणी को परिभाषित करते हैं तो संकलन समय पर जाना जाता है।असुरक्षित आकार

लेकिन हाल ही में मैं AOSP कोड को पढ़ने के लिए, और इस पाया: http://androidxref.com/5.1.1_r6/xref/system/netd/server/NetdConstants.cpp#70

static int execIptables(IptablesTarget target, bool silent, va_list args) { 
    /* Read arguments from incoming va_list; we expect the list to be NULL terminated. */ 
    std::list<const char*> argsList; 
    argsList.push_back(NULL); 
    const char* arg; 
    do { 
     arg = va_arg(args, const char *); 
     argsList.push_back(arg); 
    } while (arg); 

    int i = 0; 
    const char* argv[argsList.size()]; 
    ... 

ऐसा लगता है कि const char* argv[argsList.size()]; एक आकार जो केवल कार्यावधि में जाना जाता है का उपयोग करता है। ऐसा इसलिए है क्योंकि इस सरणी को एक फ़ंक्शन में परिभाषित किया गया है जो सरणी में सरणी आवंटित करेगा या क्योंकि संकलक यह समझ सकता है कि आकार संकलित समय पर क्या है?

+0

कुछ कंपाइलर्स स्टैक पर एक एक्सटेंशन के रूप में समर्थन (एक विस्तार के रूप में) सरणी जो केवल रनटाइम पर जाना जाता है। – BoBTFish

+1

लेखक इस कोड का निर्माण कर रहे किसी भी सी ++ कंपाइलर द्वारा समर्थित होने के लिए एक गैर मानक फीचर (परिवर्तनीय लंबाई सरणी, वीएलए) की उम्मीद कर रहा है। – WhozCraig

+3

एक 'std :: list' varargs जमा करने के लिए प्रयुक्त होता है, फिर वीएलए बनाने के लिए उपयोग किया जाता है और वहां सबकुछ कॉपी करता है? इस कचरे को किसने लिखा है? मैं अब इस फोन का उपयोग नहीं करना चाहता ... –

उत्तर

0

सही शब्दावली चर-लंबाई-सरणी (VLA) है।

सी ++ भाषा मानक इस सुविधा का समर्थन नहीं करता है।

सी भाषा मानक कुछ बिंदु पर इसका समर्थन करना शुरू कर दिया।

स्मृति में आवंटन संकलक-निर्भर है (यानी, मानक द्वारा निर्धारित नहीं)।

+0

आपको यह निर्दिष्ट करना चाहिए कि भले ही मानक सी ++ इसका समर्थन नहीं करता है, यह एक सामान्य एक्सटेंशन है (जीसीसी और क्लैंग दोनों द्वारा समर्थित)। –

+0

@MatteoItalia: ठीक है, अच्छा बिंदु। मैं निश्चित रूप से सामान्य मानक का जिक्र कर रहा था। यहां आपकी टिप्पणी मेरे लिए यह करेगी (क्योंकि मुझे यकीन नहीं है कि अन्य सी ++ कंपाइलर्स इसका समर्थन करते हैं)। धन्यवाद :) –

+0

जीसीसी और क्लैंग, लेकिन * नहीं * एमएसवीसी - जो आपके लक्षित प्लेटफार्मों के आधार पर एक मुद्दा हो सकता है। –

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