2010-02-06 14 views
9

से संबंधित ट्यूटोरियल प्रश्न मैं इस tutorial (http://theocacao.com/document.page/234) का पालन कर रहा हूं। मैं इस अनुच्छेद के बारे में उलझन में हूं, मुख्य रूप से कॉलोक से संबंधित रेखाएं:सी कॉलोक बनाम malloc

हम कॉलोक नामक मॉलोक फ़ंक्शन की विविधता का भी उपयोग कर सकते हैं। कॉलोक फ़ंक्शन में दो तर्क, मूल्य गणना और आधार मान आकार होता है। यह भी एक सूचक है, जो कुछ मामलों में अप्रत्याशित व्यवहार और दुर्घटनाओं से बचने में उपयोगी है लौटने से पहले स्मृति को साफ करता है: अंतिम पंक्ति मुझे confuses

है। स्मृति को साफ़ करने का क्या अर्थ है?

उत्तर

20

फ़ंक्शन कॉलोक यह सुनिश्चित करेगा कि लौटाई गई मेमोरी में सभी बाइट्स 0 पर सेट हो जाएं। Malloc ऐसी कोई गारंटी नहीं देता है। जो डेटा वह लौटाता है, वह दिखता है, और होगा, जिसमें यादृच्छिक डेटा शामिल होगा।

भेदभाव डेटा सदस्यों के प्रारंभ के लिए बहुत उपयोगी है। यदि 0 संरचना में सभी मानों के लिए 0 एक अच्छा डिफ़ॉल्ट है तो कॉलोक संरचना निर्माण को सरल बना सकता है।

Foo* pFoo = calloc(1, sizeof(Foo)); 

बनाम

Foo* pFoo = malloc(sizeof(Foo)); 
pFoo->Value1 = 0; 
pFoo->Value2 = 0; 

अशक्त स्पष्टता के लिए छोड़े गए जाँच।

+0

... परिणामस्वरूप कि यदि आप * स्मृति को ठीक से प्रारंभ नहीं करते हैं तो आपको अप्रत्याशित परिणाम मिलते हैं। – dmckee

+0

यदि आप 'realloc()' का उपयोग करने जा रहे हैं, तो आपको इस तथ्य से निपटना होगा कि अतिरिक्त मेमोरी शून्य नहीं है - इसलिए आपको शायद नौकरी करने के लिए अपने प्रारंभिक कोड की आवश्यकता है (पर्याप्त)। जाहिर है, अगर आप 'कॉलोक()' स्मृति को याद करते हैं और कभी भी 'realloc() 'नहीं करेंगे, तो इससे कोई फर्क नहीं पड़ता। –

+1

"यादृच्छिक रूप से यादृच्छिक डेटा" होगा - "यादृच्छिक" के कुछ मूल्यों के लिए।सांख्यिकीय परीक्षणों की संभावना 0 से अधिक समान रूप से वितरित असतत यादृच्छिक चर के लगातार नमूने से इसे अलग करने में सक्षम होगी ... UCHAR_MAX ;-) –

7

सटीक होना करने के लिए:

जो अप्रत्याशित व्यवहार और कुछ मामलों

में दुर्घटनाओं से बचने में उपयोगी है

पढ़ना चाहिए:

जो अप्रत्याशित छुपा में उपयोगी है में व्यवहार और क्रैश कुछ मामलों

4

इस मामले में "स्मृति को साफ़ करने के लिए" इसे भौतिक ऑल-शून्य बिट पैटर्न से भरना है। ध्यान दें, औपचारिक दृष्टिकोण से, इस प्रकार की कच्ची मेमोरी प्रारंभिकता केवल अभिन्न प्रकारों के साथ काम करने की गारंटी है। अर्थात। अभिन्न प्रकार की वस्तुओं को शून्य के प्रारंभिक मान प्राप्त करने की गारंटी है। चाहे किसी अन्य प्रकार का अर्थपूर्ण रूप से प्रारंभ किया जाए, कार्यान्वयन-परिभाषित है। (यह अतिरिक्त मानक प्रदान करने के लिए सी मानक की सीमा से परे है। पीओएसआईक्स, आईईईई 754 इत्यादि)

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

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