2009-07-30 18 views

उत्तर

12

तकनीकी रूप से, यह सी ++ का हिस्सा नहीं है। आप सी 99 (आईएसओ/आईईसी 98 99: 1 999) में परिवर्तनीय लंबाई सरणी कर सकते हैं लेकिन वे सी ++ का हिस्सा नहीं हैं। जैसा कि आपने पाया है, वे कुछ कंपाइलर्स द्वारा विस्तार के रूप में समर्थित हैं।

10

जी ++ एक सी 99 सुविधा का समर्थन करता है जो गतिशील रूप से आकार के सरणी की अनुमति देता है। यह मानक सी ++ नहीं है। जी ++ में -ansi विकल्प है जो कुछ विशेषताओं को बंद करता है जो सी ++ में नहीं हैं, लेकिन यह उनमें से एक नहीं है। ++ कि कोड अस्वीकार जी बनाने के लिए, -pedantic विकल्प का उपयोग:

 
$ g++ -pedantic junk.cpp 
junk.cpp: In function ‘int main()’: 
junk.cpp:4: error: ISO C++ forbids variable-size array ‘pz’ 
6

आप ढेर पर एक गतिशील सरणी चाहते हैं:

void dynArray(int x) 
{ 
    int *array = (int *)alloca(sizeof(*array)*x); 

    // blah blah blah.. 
} 
+6

यह काम करता है, लेकिन मैं "मैन एलोका" से निम्नलिखित उद्धरण जोड़ना चाहता हूं: "एलोका() फ़ंक्शन मशीन और कंपाइलर निर्भर है; इसका उपयोग निराश है।" –

2

व्यावहारिक रूप से, बोल आप एक गतिशील सरणी का उपयोग करना चाहिए करना चाहते हैं std :: में के रूप में वेक्टर,:

 
#include <iostream> 
#include <cstdlib> 
#include <vector> 

int main(int argc, char* argv[]) 
{ 
    int size; 
    std::cin>>size; 
    std::vector<int> array(size); 
    // do stuff with array ... 
    return 0; 
} 

आप सिंटैक्स के बारे में बहुत जिज्ञासु होते हैं, तो क्या आप के लिए देख रहे हैं:

 
//... 
int* array = new int[size]; 
// Do stuff with array ... 
delete [] array; 
//... 

इनमें से कोई भी स्थानीय संग्रहण के साथ आवंटित नहीं है। स्थानीय स्टोरेज का उपयोग करके स्वचालित रूप से आवंटित एक गतिशील आकार का सरणी वर्तमान में मानक C++ में समर्थित नहीं है, लेकिन वर्तमान सी मानक में समर्थित है।

आपका कोड अभी मानक सी नहीं है ++:

+0

क्या ढेर पर नई आवंटित स्मृति नहीं है? मैं इस धारणा के तहत था कि ओपी चाहता था कि इसे स्टैक पर आवंटित किया जाए, प्रश्न के शीर्षक को दिया गया। – mrduclaw

+1

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

+1

कुछ मामलों में महत्वपूर्ण प्रदर्शन की आवश्यकता वाले अनुप्रयोगों के लिए, यदि संकलक "int सरणी [x]" वाक्यविन्यास का समर्थन नहीं करता है तो ऑलोकै बिल्कुल सही जवाब है। स्टैक-आधारित आवंटन, आमतौर पर स्टैक पॉइंटर से घटाए गए एक ही निर्देश, ढेर समकक्षों की तुलना में तेज़ होते हैं। –

13

यहाँ इन सभी अन्य लोगों के अपने संयोजन जवाब है। यह मानक सी 99 है। ऐसा इसलिए है क्योंकि सी 99 आपको उस तरह से गतिशील रूप से सरणी घोषित करने की अनुमति देता है। स्पष्ट करने के लिए, यह भी मानक C99 है:

#include <stdio.h> 

int main() 
{ 
    int x = 0; 

    scanf("%d", &x); 

    char pz[x]; 
} 

यह वह जगह है नहीं मानक कुछ भी:

#include <iostream> 

int main() 
{ 
    int x = 0; 
    std::cin >> x; 
    char pz[x]; 
} 

यह मानक सी ++ नहीं किया जा सकता क्योंकि यह है कि आवश्यक निरंतर सरणी आकार, और इसकी वजह मानक सी नहीं किया जा सकता सी std::cin (या नामस्थान, या वर्गों, आदि ...) नहीं है

यह मानक सी ++ बनाने के

, ऐसा करते हैं:

int main() 
{ 
    const int x = 12; // x is 12 now and forever... 
    char pz[x]; // ...therefore it can be used here 
} 

आप एक गतिशील सरणी चाहते हैं, आप ऐसा कर सकते हैं:

#include <iostream> 

int main() 
{ 
    int x = 0; 
    std::cin >> x; 

    char *pz = new char[x]; 

    delete [] pz; 
} 

लेकिन आप ऐसा करते हैं चाहिए:

#include <iostream> 
#include <vector> 

int main() 
{ 
    int x = 0; 
    std::cin >> x; 

    std::vector<char> pz(x); 
} 
3

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

स्टैंडर्ड तरह से अगर आप स्मृति विखंडन से बचने और स्मृति आवंटन speedup करने के लिए चाहते हैं कस्टम संभाजक साथ std :: वेक्टर उपयोग करने के लिए है। फास्ट आवंटक के अच्छे नमूने के लिए boost::pool_alloc पर एक नज़र डालें।

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