2011-09-24 6 views
8

आईएमओ एक पर्याप्त है, calloc को दो तर्कों में विभाजित करने की आवश्यकता क्यों है?क्यों कॉलोक दो तर्क लेता है जबकि मॉलोक केवल एक ही होता है?

+10

के समृद्ध इतिहास के एक दैनिक अनुस्मारक क्योंकि कुछ प्रोग्रामर इसे उस तरह से बनाया गया है और इस प्रकार यह हमेशा के लिए रोक लगा दी है ... –

+1

यदि आप डॉन यह पसंद नहीं है, '# परिभाषित कॉलोक (एक्स) (कॉलोक) (एक्स, 1)' काम करना चाहिए। –

+5

@ क्रिस या मॉलोक या परिवार को फिर से परिभाषित करने के लिए प्रीप्रोसेसर का उपयोग करके क्रिस बहुत खराब विचार की तरह लगता है (शायद स्मृति आवंटन को डिबग करने के लिए छोड़कर)। – ssube

उत्तर

3

पैरामीटर नाम यह काफी अच्छा दस्तावेज़:

void *malloc(size_t size); 
void *calloc(size_t nelem, size_t elsize); 

बाद वाले मिलकर तत्वों और तत्व आकार की संख्या उपलब्ध कराने के द्वारा, सरणियों के साफ आवंटित करने के लिए अनुमति देता है। गुणा करके malloc के साथ एक ही व्यवहार प्राप्त किया जा सकता है।

हालांकि, calloc भी आवंटित स्मृति को 0. malloc में प्रारंभ नहीं करता है, इसलिए मान अपरिभाषित है। malloc सिद्धांत में, सभी स्मृति को स्थापित करने के कारण तेज़ हो सकता है; यह केवल बड़ी मात्रा में ध्यान देने की संभावना है।

this question में, यह सुझाव दिया जाता है कि calloc स्पष्ट-आवंटन और malloc मेम-आवंट है।

+4

में तर्कों को गुणा करते हैं। दो तर्कों का एक अन्य लाभ अतिप्रवाह जांच के लिए संभावित है, सामान्य रूप से कठिन (और शायद ही कभी किया जाता है)' मॉलोक 'के साथ (हालांकि यदि आप वस्तुओं की आवंटित कर रहे हैं आकार जो अतिप्रवाह हो सकता है आप इसे गलत कर सकते हैं)। –

+1

@Chris: शायद हमें एक 'cccalloc' की आवश्यकता है जो 6 तर्क लेता है और सभी subexpressions पर अतिप्रवाह जांच के साथ 'ए * बी + सी * डी + ई * एफ' बाइट आवंटित करता है ... ;-) –

+6

मुझे नहीं लगता कि यह सवाल का जवाब है। यह नहीं पूछता कि ये कैसे काम करते हैं (फिर यह सिर्फ एक डुप्लिकेट होगा और बंद होना चाहिए)। यह 'malloc' के लिए केवल एक कुल आकार रखने के बजाय दो में तर्क को विभाजित करने के तर्क के लिए पूछता है। –

5

मुझे लगता है कि यह शायद इतिहास है और उन समयों की भविष्यवाणी करता है जहां सी कार्यों के लिए प्रोटोटाइप था। प्रोटोटाइप के बिना इन समय तर्कों को मूल रूप से int होना था, typedefsize_t शायद अभी तक इसका आविष्कार नहीं किया गया था। लेकिन फिर INTMAX सबसे बड़ा हिस्सा है जिसे आप malloc के साथ आवंटित कर सकते हैं और इसे दो में विभाजित कर सकते हैं, आपको अधिक लचीलापन देता है और आपको वास्तव में बड़े सरणी आवंटित करने की अनुमति देता है। यहां तक ​​कि उस समय सिस्टम से बड़े पेज प्राप्त करने के तरीके भी थे, जहां डिफ़ॉल्ट रूप से शून्य आउट किया गया था, इसलिए के मुकाबले calloc के साथ दक्षता इतनी अधिक समस्या नहीं थी।

आजकल, size_t और हाथ में समारोह प्रोटोटाइप के साथ, यह सिर्फ सी

+0

यह सवाल बिल्कुल उत्तर नहीं देता। उपयोग किए गए पूर्णांक प्रकार की चौड़ाई इस प्रश्न के लिए पूरी तरह से अप्रासंगिक है। – Jeff

+0

@ जेफ, क्या आप कृपया समझा सकते हैं? मैं यह नहीं कह रहा हूं कि आज इस्तेमाल किए गए पूर्णांक प्रकार की चौड़ाई के साथ कुछ भी करना है। मैं कह रहा हूं कि उस समय इंटरफेस बनाया गया था, यह एक मुद्दा हो सकता है। –

+0

मैं इस सुझाव पर ऑब्जेक्ट करता हूं कि यह "वास्तव में बड़े सरणी" के लिए है। एक के स्थान पर दो तर्कों का उपयोग करने के लिए यह खराब एपीआई डिज़ाइन है। और क्यों कोई ऐसे व्यक्ति को 'कॉलोक' करना चाहता है जो बाद में 'रीयलोक' को मनमाने ढंग से नहीं कर सकता था, या जिस पर वे उपयोग नहीं कर सके। 'मेमसेट' या 'memcpy'? मेरी पांडित्य पर नाराज होने के लिए स्वतंत्र महसूस, लेकिन यह sizeof के बारे में कुछ कहने के लिए() अहस्ताक्षरित लौटने और सरणियों _ever तो slightly_ 'INT_MAX' से बड़ा आवंटन उचित होगा। – Jeff

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