2013-02-21 14 views
10

मेरा प्रश्न यह है कि sizeof() कब गुजरता है, गतिशील सरणी परिवर्तनीय लंबाई सरणी है।वेरिएबल लम्बाई सरणी (सी केवल) पर आकार का व्यवहार

के उदाहरण पर विचार करें:

int fun(int num_of_chars) 
{ 
    char name_arr[num_of_chars] = {0}; 

    /* Do something*/ 

    return sizeof(name_arr); 
} 

इस उदाहरण में यह स्पष्ट है कि वापसी मान एक संकलन समय स्थिर नहीं है। क्योंकि आकार num_of_chars के रन टाइम मान पर निर्भर करता है।

C99 मानक से एक उद्धरण (6.5.3.4):

sizeof ऑपरेटर अपनी संकार्य के आकार (बाइट्स में) है, जो एक अभिव्यक्ति या एक प्रकार की parenthesized नाम हो सकता है अर्जित करता है। आकार ऑपरेंड के प्रकार से निर्धारित किया गया है। नतीजा एक पूर्णांक है। यदि ऑपरेंड का प्रकार परिवर्तनीय लंबाई सरणी प्रकार है, तो ऑपरेंड का मूल्यांकन किया जाता है; अन्यथा, ऑपरेटिंग मूल्यांकन नहीं किया गया है और परिणाम एक पूर्णांक निरंतर है।

क्या मैं से [.... संकार्य मूल्यांकन किया जाता है ....] है, जब तर्क sizeof() के लिए पारित एक गतिशील सरणी चर लंबाई सरणी है, sizeof() एक 'की तरह बर्ताव करता है कि समझ सकता हूँ एक ऑपरेटर के रूप में कार्य करें और नहीं।

क्या मेरी समझ सही है?

+0

'sizeof()' अभी भी एक ऑपरेटर है; जब तर्क एक परिवर्तनीय लंबाई सरणी है तो यह अब संकलन-समय स्थिरता उत्पन्न नहीं करता है। –

+0

क्या आपका कोड संकलित करता है? मुझे 'वेरिएबल-साइज्ड ऑब्जेक्ट प्रारंभ नहीं किया जा सकता है' त्रुटि –

उत्तर

6

यह अभी भी एक ऑपरेटर के रूप में व्यवहार करता है। कास्ट भी ऑपरेटर है और इसका तर्क भी मूल्यांकन करता है और * या & करता है। एक ऑपरेटर होने के नाते एक वाक्य रचनात्मक श्रेणी है। वह नहीं बदलता है।

महत्वपूर्ण अंतर यह है कि यह बर्ताव करता है के रूप में अन्य मामलों में अभिव्यक्ति जबकि यह रूप में निरंतर बर्ताव करता है।


अद्यतन: मुझे लगता है कि नीचे टिप्पणी की मैं नहीं दिख रहा है यही कारण है कि मूल्यांकन फर्क नहीं पड़ता है, लेकिन अब मुझे एहसास हुआ कि वहाँ दो तरीकों से आप चर लंबाई सरणी के साथ sizeof लिख सकते हैं।

int a[x]; 
sizeof(a) 

जिस स्थिति में मूल्यांकन कर a वास्तव में कोई फर्क नहीं पड़ता: या तो आप चर चर लंबाई सरणी के रूप में घोषित पारित कर सकते हैं। लेकिन क्या आप भी तर्क है, जो

sizeof(int[x]) 

होगा और इस मामले में परिणाम x * sizeof(int) है और x मूल्यांकन किया जाना चाहिए के रूप में एक प्रकार उपयोग कर सकते हैं। जो मुझे लगता है वह विनिर्देशन का उल्लेख क्यों करता है।

+0

"और इसके तर्क का भी मूल्यांकन करता है" - नहीं, ऐसा नहीं है। 'Sizeof() 'को पारित अभिव्यक्ति का मूल्यांकन नहीं किया जाता है। –

+1

@ एच 2CO3: कृपया, प्रश्न पढ़ें। यह मानक कहता है कि ऑपरेंड का मूल्यांकन किया जाता है यदि यह एक चर लंबाई लंबाई है। उस ने कहा कि सी 99 में परिवर्तनीय लंबाई सरणी प्रकार की एकमात्र अभिव्यक्ति इतनी घोषित चरम है और मूल्यांकन है कि इसका कोई प्रभावशाली प्रभाव नहीं है, इसलिए मुझे यकीन नहीं है कि भेद क्यों किया जाता है (सी ++ एक और मामला है, लेकिन सी ++ 11 में यह भी शामिल नहीं है सुविधा)। –

+1

@ एच 2CO3: असल में अब मुझे एहसास हुआ कि जब आप एक चर लंबाई लंबाई सरणी _type_ को 'sizeof' पास करते हैं, तो अभिव्यक्ति का मूल्यांकन किया जाता है और संभावित रूप से देखने योग्य दुष्प्रभावों के साथ। उत्तर अपडेट किया गया। –

4

मेरा प्रश्न यह है कि जब उत्तीर्ण तर्क तर्क गतिशील सरणी है तो वास्तव में आकार() व्यवहार करता है।

  1. ठीक है, आप बल्कि एक "चर लंबाई सरणी" (VLA) का मतलब है।

  2. यह लगभग बिल्कुल वही व्यवहार करता है: यह बाइट में सरणी का आकार देता है।

sizeof() एक समारोह और एक ऑपरेटर के रूप में नहीं 'की तरह बर्ताव'।

नहीं, यह कभी भी एक समारोह नहीं था। एकमात्र चीज जो बदलती है वह यह है कि यदि वीएलए पर प्रयोग किया जाता है, तो यह ऑपरेटर संकलन-समय निरंतर उत्पन्न नहीं करता है, अन्यथा यह करता है।

+0

डाउनवोट के कारण? –

+1

क्योंकि कुछ लोग यहां निराश हैं। –

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