2009-08-11 12 views
5

कुछ उदाहरण कोड देख रहे हैं और कुछ शून्य-आकार सरणी आवंटन में आते हैं।शून्य आकार के सरणी आवंटन का क्या अर्थ है?

class T 
{ 
}; 

int main(void) 
{ 
    T * ptr = new T[0]; 

    return 0; 
} 

इसके उपयोग क्या है: मैं अपने प्रश्न

यह वह जगह है मान्य कोड स्पष्ट करने के लिए निम्नलिखित कोड का टुकड़ा बनाया? क्या पीटीआर वैध है? क्या यह पोर्टेबल निर्माण है?

उत्तर

8

सी ++ स्टैंडर्ड में 5.3.4:

6 हर एक प्रत्यक्ष-new-declarator में लगातार अभिव्यक्ति एक अभिन्न निरंतर अभिव्यक्ति (5.19) हो सकता है और एक कड़ाई से सकारात्मक मूल्य का मूल्यांकन करेगा। एक प्रत्यक्ष-new-declarator में अभिव्यक्ति एक गैर नकारात्मक मूल्य के साथ अभिन्न या गणना प्रकार (3.9.1) होगा ...

7 जब एक प्रत्यक्ष में अभिव्यक्ति का मूल्य -नया-declarator शून्य है, आवंटन समारोह कोई तत्वों के साथ एक सरणी आवंटित करने के लिए कहा जाता है।

तो, अपने कोड एक सरणी जो (साथ नष्ट [], एक पैरामीटर, शायद अन्य बातों के रूप में पारित हटाया जा सकता है) टी के किसी भी अन्य सरणी की तरह हर मामले में बर्ताव करता है आवंटित करता है। हालांकि, यह कोई सुलभ अनुक्रमित है (जो है, पढ़ने या लिखने ptr [0] अपरिभाषित व्यवहार में परिणाम)।

इस संदर्भ में निरंतर अभिव्यक्ति और अभिव्यक्ति के बीच अलग-अलग नहीं है कि वास्तविक अभिव्यक्ति समय स्थिर (जो स्पष्ट रूप से 0 है) संकलित है, लेकिन क्या यह बहु-आयामी सरणी के "अंतिम" आयाम को निर्दिष्ट करता है।वाक्यविन्यास 5.3.4: 1 में परिभाषित किया गया है।

0

हां यह वैध व्यवहार है, और पीटीआर मान्य होगा। निर्माण सभी सी ++ कंपाइलर्स के लिए पोर्टेबल है जो सी ++ मानक का पालन करते हैं। यह उपयोगी है कि यह आपको कोड लिखने की अनुमति देता है जिसके लिए मामले को संभालने के लिए विशेष-मामले स्टूफ की आवश्यकता नहीं होती है जहां तत्वों की संख्या शून्य होती है।

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

2

यह अधिकृत है (5.3.4/6)। इसका परिणाम एक खाली सरणी है, इसलिए वापस दिया गया मान सरणी के पीछे सूचक है।

0

इससे संबंधित एक सवाल यह है:

calloc, malloc हैं, और realloc कार्यों वापसी एक अशक्त सूचक या एक: What should malloc(0) return?

And from some C99 docs, malloc (0) व्यवहार कार्यान्वयन परिभाषित किया गया है जब अनुरोध किया गया आकार शून्य (7.20.3) है तो आवंटित ऑब्जेक्ट को पॉइंटर।

या तो एक शून्य सूचक या अद्वितीय पॉइंटर जिसे मुक्त() पर वापस किया जा सकता है।

मॉलोक (3 सी) मैन पेज देखें।

माना जाता है कि आप सी ++ के बारे में पूछ रहे हैं, लेकिन मॉलोक जानकारी शायद वैसे भी उपयोगी है।

+1

सी ++ नया अच्छी तरह परिभाषित है। – AProgrammer

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