2013-07-08 3 views
5

का उपयोग करके आवंटित करते समय शून्य वर्ण शामिल है, मैं काफी समय से सी का उपयोग कर रहा हूं, और मेरे पास यह मामूली समस्या है जिसके बारे में मैं पूछना चाहता हूं।मॉलोक

कहें कि मैं एक वर्ण सरणी बनाना चाहता हूं जो 1000 वर्ण तक संग्रहीत करे। अब, जब मैं इसके लिए malloc का उपयोग कर रहा हूं, तो क्या मैं सरणी का आकार 1001 वर्ण [1000 वर्ण + शून्य] या केवल 1000 के रूप में निर्दिष्ट करता हूं?

इसके अलावा, मैं कहता हूं कि मैं इस समस्या से आया हूं, तो मुझे कुछ परीक्षण कार्यक्रमों का उपयोग करके शायद इस समाधान का जवाब कैसे मिल सकता है। मैं समझता हूं कि स्ट्रिंग के आकार को शून्य चरित्र के बिना गणना की जाती है, लेकिन जब मैं इसके लिए स्मृति आवंटित कर रहा हूं, तो क्या मैं नल चरित्र को भी ध्यान में रखता हूं?

उत्तर

7

आप अशक्त-समाप्त स्ट्रिंग के भंडारण के लिए है कि ब्लॉक की जरूरत है तो हाँ, आप explictly malloc() पूछने के लिए अशक्त-टर्मिनेटर के भंडारण के लिए एक अतिरिक्त बाइट आवंटित करने के लिए की जरूरत है, malloc() यह आप के लिए नहीं तो काम नहीं चलेगा। यदि आप स्ट्रिंग लम्बाई कहीं और स्टोर करना चाहते हैं और इसलिए आपको शून्य टर्मिनेटर की आवश्यकता नहीं है तो आप अतिरिक्त बाइट आवंटित किए बिना दूर हो सकते हैं।बेशक यह आप पर निर्भर करता है कि आपको तारों के लिए निरंतर समाप्ति की आवश्यकता है, बस यह न भूलें कि सी लाइब्रेरी स्ट्रिंग हैंडलिंग फ़ंक्शन केवल शून्य-समाप्त तारों के साथ काम करते हैं।

1

आपको वास्तव में शून्य टर्मिनेटर के लिए स्मृति आवंटित करने की आवश्यकता है।

संकल्पनात्मक रूप से शून्य टर्मिनेटर एक स्ट्रिंग के अंत को चिह्नित करने का एक सुविधाजनक तरीका है। स्ट्रिंग मॉडलिंग करते समय सी मानक लाइब्रेरी इस सम्मेलन का फायदा उठाती है। उदाहरण के लिए, स्ट्रेलन इनपुट स्थान (शायद एक char *) से मेमोरी की जांच करके एक स्ट्रिंग की लंबाई की गणना करता है जब तक कि यह शून्य टर्मिनेटर तक नहीं पहुंच जाता; लेकिन शून्य टर्मिनेटर स्वयं लंबाई में शामिल नहीं है। लेकिन यह अभी भी स्ट्रिंग द्वारा खपत स्मृति का हिस्सा है।

1

यह आपके लिए शून्य-समाप्ति चरित्र प्रदान करने के लिए है।

malloc आपके लिए स्मृति आवंटित करता है लेकिन यह इसे किसी भी चीज़ पर सेट नहीं करता है।

यदि आप आवंटित स्मृति में strcpy हैं तो आपके लिए एक शून्य-टर्मिनेटर प्रदान किया जाएगा।

वैकल्पिक रूप से, calloc का उपयोग के रूप में यह 0 करने के लिए सभी तत्व है, जो प्रभाव में अशक्त-टर्मिनेटर है सेट हो जाएगा। फिर यदि आप करते हैं, तो कहें, memcpy, आपको स्ट्रिंग को ठीक से समाप्त करने की चिंता करने की आवश्यकता नहीं होगी।

+2

आपको अभी भी ध्यान रखना होगा कि शून्य टर्मिनेटर को एक अतिरिक्त बाइट की आवश्यकता है, इसलिए यदि आपकी स्ट्रिंग को हजारों अक्षरों की आवश्यकता होती है, तो 'कॉलोक()' का उपयोग करके इस तथ्य को नहीं बदला जाता है कि आपको हजारों की आवश्यकता है और अपनी स्ट्रिंग को स्टोर करने के लिए एक बाइट्स। –

2

malloc और परिवार बाइट्स के टुकड़ों में स्मृति आवंटित करता है। तो यदि आप malloc(1000) करते हैं तो आपको 1000 बाइट मिलते हैं। malloc परवाह नहीं करेगा यदि आपने स्ट्रिंग या किसी अन्य डेटा प्रकार को रखने के लिए उन 1000 बाइट आवंटित किए हैं।

के बाद से सी में तार चरित्र प्रति एक बाइट से मिलकर बनता है और आदर्श अशक्त समाप्त करने का क्या आप वाकई कि पकड़ करने के लिए पर्याप्त स्मृति है बनाने के लिए की जरूरत है। तो जवाब यह है: हां, आपको 1001 बाइट आवंटित करने की आवश्यकता है यदि आप 1000 वर्णों और शून्य टर्मिनेटर की स्ट्रिंग रखना चाहते हैं।

उन्नत युक्ति: यह भी ध्यान है कि कैसे आप इसका इस्तेमाल पर निर्भर करता है कि आप या एक स्ट्रिंग समाप्त शून्य करने की आवश्यकता नहीं हो सकता है में रहते हैं।

आप उदाहरण के लिए अपने स्ट्रिंग की सटीक लंबाई जानते हैं कि आप निर्दिष्ट कर सकते हैं कि जब यह printf के साथ प्रयोग कर

printf("%*s", length, string); 

बिल्कुल length वर्ण प्रिंट होगा बफर से string पर इशारा किया।

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