आईएमओ एक पर्याप्त है, calloc
को दो तर्कों में विभाजित करने की आवश्यकता क्यों है?क्यों कॉलोक दो तर्क लेता है जबकि मॉलोक केवल एक ही होता है?
उत्तर
पैरामीटर नाम यह काफी अच्छा दस्तावेज़:
void *malloc(size_t size);
void *calloc(size_t nelem, size_t elsize);
बाद वाले मिलकर तत्वों और तत्व आकार की संख्या उपलब्ध कराने के द्वारा, सरणियों के साफ आवंटित करने के लिए अनुमति देता है। गुणा करके malloc
के साथ एक ही व्यवहार प्राप्त किया जा सकता है।
हालांकि, calloc
भी आवंटित स्मृति को 0. malloc
में प्रारंभ नहीं करता है, इसलिए मान अपरिभाषित है। malloc
सिद्धांत में, सभी स्मृति को स्थापित करने के कारण तेज़ हो सकता है; यह केवल बड़ी मात्रा में ध्यान देने की संभावना है।
this question में, यह सुझाव दिया जाता है कि calloc
स्पष्ट-आवंटन और malloc
मेम-आवंट है।
में तर्कों को गुणा करते हैं। दो तर्कों का एक अन्य लाभ अतिप्रवाह जांच के लिए संभावित है, सामान्य रूप से कठिन (और शायद ही कभी किया जाता है)' मॉलोक 'के साथ (हालांकि यदि आप वस्तुओं की आवंटित कर रहे हैं आकार जो अतिप्रवाह हो सकता है आप इसे गलत कर सकते हैं)। –
@Chris: शायद हमें एक 'cccalloc' की आवश्यकता है जो 6 तर्क लेता है और सभी subexpressions पर अतिप्रवाह जांच के साथ 'ए * बी + सी * डी + ई * एफ' बाइट आवंटित करता है ... ;-) –
मुझे नहीं लगता कि यह सवाल का जवाब है। यह नहीं पूछता कि ये कैसे काम करते हैं (फिर यह सिर्फ एक डुप्लिकेट होगा और बंद होना चाहिए)। यह 'malloc' के लिए केवल एक कुल आकार रखने के बजाय दो में तर्क को विभाजित करने के तर्क के लिए पूछता है। –
मुझे लगता है कि यह शायद इतिहास है और उन समयों की भविष्यवाणी करता है जहां सी कार्यों के लिए प्रोटोटाइप था। प्रोटोटाइप के बिना इन समय तर्कों को मूल रूप से int
होना था, typedef
size_t
शायद अभी तक इसका आविष्कार नहीं किया गया था। लेकिन फिर INTMAX
सबसे बड़ा हिस्सा है जिसे आप malloc
के साथ आवंटित कर सकते हैं और इसे दो में विभाजित कर सकते हैं, आपको अधिक लचीलापन देता है और आपको वास्तव में बड़े सरणी आवंटित करने की अनुमति देता है। यहां तक कि उस समय सिस्टम से बड़े पेज प्राप्त करने के तरीके भी थे, जहां डिफ़ॉल्ट रूप से शून्य आउट किया गया था, इसलिए के मुकाबले calloc
के साथ दक्षता इतनी अधिक समस्या नहीं थी।
आजकल, size_t
और हाथ में समारोह प्रोटोटाइप के साथ, यह सिर्फ सी
यह सवाल बिल्कुल उत्तर नहीं देता। उपयोग किए गए पूर्णांक प्रकार की चौड़ाई इस प्रश्न के लिए पूरी तरह से अप्रासंगिक है। – Jeff
@ जेफ, क्या आप कृपया समझा सकते हैं? मैं यह नहीं कह रहा हूं कि आज इस्तेमाल किए गए पूर्णांक प्रकार की चौड़ाई के साथ कुछ भी करना है। मैं कह रहा हूं कि उस समय इंटरफेस बनाया गया था, यह एक मुद्दा हो सकता है। –
मैं इस सुझाव पर ऑब्जेक्ट करता हूं कि यह "वास्तव में बड़े सरणी" के लिए है। एक के स्थान पर दो तर्कों का उपयोग करने के लिए यह खराब एपीआई डिज़ाइन है। और क्यों कोई ऐसे व्यक्ति को 'कॉलोक' करना चाहता है जो बाद में 'रीयलोक' को मनमाने ढंग से नहीं कर सकता था, या जिस पर वे उपयोग नहीं कर सके। 'मेमसेट' या 'memcpy'? मेरी पांडित्य पर नाराज होने के लिए स्वतंत्र महसूस, लेकिन यह sizeof के बारे में कुछ कहने के लिए() अहस्ताक्षरित लौटने और सरणियों _ever तो slightly_ 'INT_MAX' से बड़ा आवंटन उचित होगा। – Jeff
- 1. क्यों लागू() यहां दो के बजाय केवल एक तर्क लेता है?
- 2. सी कॉलोक बनाम malloc
- 3. मॉलोक और कॉलोक विभिन्न हस्ताक्षरों के साथ कैसे समाप्त हुआ?
- 4. जेएलिस्ट चयन दो बार क्यों होता है?
- 5. EAAccessoryDidConnectNotification दो बार क्यों होता है?
- 6. करता है जबकि लूप हमेशा पूर्ण CPU उपयोग लेता है?
- 7. एलडी_PRELOAD केवल मॉलोक के लिए काम कर रहा है, मुफ्त
- 8. अंतहीन है जबकि लूप CPU संसाधनों को लेता है?
- 9. एक विधि आमंत्रण अभिव्यक्ति का प्रकार गतिशील क्यों होता है जब भी केवल एक संभावित रिटर्न प्रकार होता है?
- 10. ScalaMock। एक कक्षा को मॉक करें जो तर्क लेता है
- 11. कतार एक इंटरफ़ेस है जबकि कक्षा एक स्टैक क्यों है?
- 12. क्यों मॉलोक हमेशा NULL
- 13. एकाधिक पीएचपी, जबकि एक ही क्वेरी
- 14. सिग्नलआर बाधित होता है जबकि पेज
- 15. एक कस्टम मॉलोक
- 16. सी ++ में "नया" और "मॉलोक" और "कॉलोक" के बीच क्या अंतर है?
- 17. लेनदेनस्कोप सफलता क्यों नहीं लेता है?
- 18. आईआईएस एक ही समय में एक ही ग्राहक को दो प्रतिक्रियाएं नहीं भेजता है (केवल एएसपी के लिए)
- 19. स्टैक में हमेशा बेकार फ़ंक्शन तर्क क्यों होता है?
- 20. अद्यतन एक से अधिक समय क्यों लेता है?
- 21. क्यों एक रिकर्सन यहां होता है?
- 22. एएसपी.नेट एमवीसी एचटीएमएल क्यों है। चेकबॉक्स दो इनपुट एक ही नाम के साथ आउटपुट करता है?
- 23. आंशिक फ़ंक्शन 2 फ़ंक्शंस पर क्यों लागू होता है जो एक ही चीज को दो अलग-अलग तरीकों से परिभाषित करता है, एक अलग परिणाम देता है?
- 24. metaclass त्रुटि: प्रकार .__ init __() लेता है 1 या 3 तर्क
- 25. क्या होता है यदि दो ओबीजेसी श्रेणियां एक ही विधि को ओवरराइड करती हैं?
- 26. डी संकलन इतना लंबा क्यों लेता है?
- 27. ओपनसीवी एसवीएम ट्रेन पर अपवाद फेंक रहा है, "खराब तर्क (केवल एक ही कक्षा है)"
- 28. क्यों जावास्क्रिप्ट केवल एक चरित्र के रूप में कैरिज रिटर्न की गणना करता है जब यह दो होता है?
- 29. कास्टिंग CS0030 क्यों देता है, जबकि "जैसा" काम करता है?
- 30. openssl_pkey_new() विफल क्यों होता है?
के समृद्ध इतिहास के एक दैनिक अनुस्मारक क्योंकि कुछ प्रोग्रामर इसे उस तरह से बनाया गया है और इस प्रकार यह हमेशा के लिए रोक लगा दी है ... –
यदि आप डॉन यह पसंद नहीं है, '# परिभाषित कॉलोक (एक्स) (कॉलोक) (एक्स, 1)' काम करना चाहिए। –
@ क्रिस या मॉलोक या परिवार को फिर से परिभाषित करने के लिए प्रीप्रोसेसर का उपयोग करके क्रिस बहुत खराब विचार की तरह लगता है (शायद स्मृति आवंटन को डिबग करने के लिए छोड़कर)। – ssube