2015-09-18 4 views
147

आज मैं The C Programming Language (second edition Brian W. Kernighan & Dennis M. Ritchie) पर पहुंचा और पाया कि लेखक कहता है कि मुझे malloc डालना होगा।पुस्तक कहती है कि मुझे मॉलोक क्यों डालना चाहिए?

7.8.5 संग्रहण प्रबंधन

कार्यों malloc और calloc स्मृति के ब्लॉक प्राप्त गतिशील: यहाँ किताब से हिस्सा है।

void *malloc(size_t n) 

अप्रारंभीकृत भंडारण, या शून्य के एन बाइट्स के लिए सूचक लौटाता है यदि अनुरोध संतुष्ट नहीं हो सकता है।

void *calloc(size_t n, size_t size) 

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

int *ip; 
ip = (int *) calloc(n, sizeof(int)); 

में, उचित प्रकार में डाला जाना चाहिए, क्योंकि मैं पहले से ही पता है कि malloc (और उसके परिवार) रिटर्न प्रकार शून्य *, और there are good explanations why not to cast malloc

लेकिन मेरा सवाल यह है: पुस्तक कहती है कि मुझे इसे क्यों डालना चाहिए?

+105

क्योंकि पुस्तक पुरानी है। –

+9

क्योंकि यहां तक ​​कि सूर्य के अंधेरे धब्बे भी हैं, मेरा जवाब होगा। दूसरे शब्दों में, पुस्तक गलत है। यह हो सकता है कि टेक्स्ट 'शून्य * 'के लिए अर्थशास्त्र को पूर्ववत करता है, और अपडेट नहीं किया गया था। यह भी देखें [यह उत्तर] (http://stackoverflow.com/a/28460192/28169)। – unwind

+6

@ मिची पुस्तक में कई तथ्यात्मक और टाइपोग्राफ़िक त्रुटियां हैं (Google के एंड आर इरेटा), यह केवल सी 0 9 मानक के साथ कुछ हद तक संगत है, यह वर्तमान सी मानक को संबोधित नहीं करता है और न ही 1 99 0 से भाषा में कोई भी बदलाव। सबसे बुरी तरह से भरा हुआ है खराब प्रोग्रामिंग अभ्यास, खराब शैली और कोड जो खराब-निर्दिष्ट व्यवहार पर निर्भर करता है।यदि आप एक पेशेवर सी प्रोग्रामर बन जाते हैं तो आप सभी को बेकार करना होगा। – Lundin

उत्तर

200
http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm से

:

पूर्व एएनएसआई सी में - कश्मीर & में वर्णित के रूप आर-1 - malloc() एक char * लौट आए और यह सभी मामलों में जहां में अपनी वापसी मूल्य कास्ट करने के लिए जरूरी हो गया था प्राप्त करने वाला चर char * भी नहीं था। नया void * में टाइप करें मानक सी इन उल्लंघनों को अनावश्यक बनाता है।

कश्मीर & आर -2 के रक्षा करने के लिए बेकार में उछाल की शर्मिंदगी से किसी को बचाने के लिए, मैं एक राय है कि मैं सजा की वैधता पर बोली पेज 142. से वह ऊपर उद्धृत सकता है के लिए डेनिस रिची पूछा उत्तर दिया:

किसी भी मामले में, अब मैं पी पर सामान को फिर से पढ़ता हूं। 142, मुझे लगता है कि यह गलत है; यह इस तरह से लिखा गया है कि यह पहले नियमों के खिलाफ रक्षात्मक नहीं है, यह एएनएसआई नियमों को गलत तरीके से प्रस्तुत करता है।

+19

तो वापसी का प्रकार मॉलोक ** char ** था और ** शून्य नहीं ** । धन्यवाद। – Michi

+10

यह इरेटा http://web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html – nos

+17

में भी उल्लेख किया गया है आपको इस पुस्तक को नहीं पढ़ना चाहिए आपके बगल में एक पेपर (ओं) पर मुद्रित उस इरेटा के बिना। – Lundin

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