2010-06-25 22 views
9

का उपयोग कर चार सरणी हाय हाल ही में मैं ऑनलाइन पर कोड का एक बहुत कुछ देखा (यह भी पर एसओ;) की तरह:आवंटन malloc

char *p = malloc(sizeof(char) * (len + 1)); 

क्यों sizeof (चार)? यह जरूरी नहीं है, है ना? या यह सिर्फ शैली का मामला है? इसमें क्या फायदे हैं?

+1

http://stackoverflow.com/questions/1011806/is-it-necessary-to-multiply-by-sizeof-char-when का डुप्लिकेट -मैनिपुलेटिंग-मेमोरी हालांकि मैं वहां स्वीकृत उत्तर से असहमत हूं (मैं आकार (char) को छोड़ना पसंद करता हूं) – user85509

उत्तर

12

हां, यह शैली का मामला है, क्योंकि आप sizeof(char) हमेशा एक होने की उम्मीद करेंगे।

दूसरी तरफ sizeof(foo) का उपयोग करने के लिए malloc का उपयोग करने के लिए यह बहुत मुहावरे है, और सबसे महत्वपूर्ण बात यह है कि यह कोड स्वयं दस्तावेज़िंग करता है।

रखरखाव के लिए भी बेहतर है। आप char से wchar का उपयोग करने जा रहे थे, तो आप ज्यादा सोचा बिना

wchar *p = malloc(sizeof(wchar) * (len + 1)); 

करने के लिए स्विच चाहते हैं। जबकि कथन char *p = malloc( len + 1 ); को परिवर्तित करने के लिए और अधिक विचार की आवश्यकता होगी। यह मानसिक उपरि को कम करने के बारे में सब कुछ है।

और जैसा कि @Nyan एक टिप्पणी में पता चलता है, तो आप भी शून्य समाप्त तार के लिए

type *p = malloc(sizeof(*p) * (len + 1)); 

कर सकता है और

type *p = malloc(sizeof(*p) * len)); 

साधारण बफ़र्स के लिए।

+0

फिर टाइप * पी = मॉलोक (आकार (* प्रकार) * (लेन + 1) का उपयोग क्यों न करें); ;) – Nyan

+3

ओह मेरा मतलब आकार (* पी) – Nyan

+0

@Nyan: निश्चित रूप से, यह भी काम करता है। मैंने इसे पहले कभी नहीं देखा है, लेकिन अगर मैं अभी भी एक कामकाजी सी प्रोग्रामर था, तो मैं आपके सुझाव को एक मुहावरे के रूप में अपनाने पर विचार करता हूं .. हालांकि 'लेन + 1' भाग केवल स्ट्रिंग जैसी वस्तुओं के लिए होगा। – brainjam

1

यह ऑपरेशन को स्वयं दस्तावेज़ में कार्य करता है। भाषा एक चार को बिल्कुल बाइट होने के लिए परिभाषित करती है। यह निर्दिष्ट नहीं करता है कि बिट उस बाइट में हैं क्योंकि कुछ मशीनों में 8, 12, 16, 1 9, या 30 बिट न्यूनतम एड्रेसेबल इकाइयां (या अधिक) हैं। लेकिन एक char हमेशा एक बाइट है।

1

विनिर्देश यह बताता है कि वर्ण 1-बाइट हैं, इसलिए यह कड़ाई से वैकल्पिक है। मैं व्यक्तिगत रूप से हमेशा sizeof स्थिरता उद्देश्यों के लिए शामिल करता हूं, लेकिन इससे कोई फर्क नहीं पड़ता

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