"सी प्रोग्रामिंग लैंग्वेज" पुस्तक में कहा गया है कि मुझे मॉलोक कास्ट करना चाहिए?


158

आज मैं द सी प्रोग्रामिंग लैंग्वेज (दूसरा संस्करण ब्रायन डब्ल्यू। कर्निघन एंड डेनिस एम। रिची) के पेज 167 पर पहुंचा और पाया कि लेखक कहता है कि मुझे कास्ट करना चाहिए । यहाँ पुस्तक से हिस्सा है:malloc

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

फ़ंक्शन मॉलॉक और कॉलोक गतिशील रूप से मेमोरी के ब्लॉक प्राप्त करते हैं।

void *malloc(size_t n)

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

void *calloc(size_t n, size_t size)

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

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

मुझे पहले से ही पता है कि malloc(और इसका परिवार) टाइप * शून्य देता है , और अच्छे स्पष्टीकरण हैं कि क्यों नहीं डाली जाएmalloc

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


125
क्योंकि किताब पुरानी है।
ओलिवर चार्ल्सवर्थ

12
क्योंकि सूर्य के भी अपने काले धब्बे हैं, तो मेरा उत्तर होगा। दूसरे शब्दों में, पुस्तक गलत है। यह हो सकता है कि पाठ शब्दार्थ के लिए पूर्वसूचक करेvoid * , और अपडेट नहीं किया गया था। इस उत्तर को भी देखें ।
खोलना

8
@ मिकी पुस्तक में कई तथ्यात्मक और टाइपोग्राफिक त्रुटियां हैं (Google K & R इरेटा), यह केवल C90 मानक के साथ कुछ हद तक संगत है, यह 1990 के बाद से वर्तमान C मानक और न ही भाषा में किसी भी बदलाव को संबोधित नहीं करता है। सबसे बुरी बात यह है कि इससे भरा हुआ है। खराब प्रोग्रामिंग अभ्यास, खराब शैली और कोड जो खराब-निर्दिष्ट व्यवहार पर निर्भर करता है। यदि आप एक पेशेवर सी प्रोग्रामर बन जाते हैं, तो आपको अनलिंक करना होगा।
लुंडिन

8
... और इसके विपरीत क्यों कंपाइलर शिकायत करता है जब मैंने मॉलॉक का परिणाम नहीं दिया है? इसलिए, C के लिए - मत डालें। C ++ के लिए - कास्ट, लेकिन इसका उपयोग न करें mallocक्योंकि यह C ++ नहीं है - सिवाय इसके कि आपको कब करना है - लेकिन आपको नहीं - सिवाय ... AGGGHHHHHH !!!!! :-)
बॉब जार्विस -

2
@ मैनड्रिल क्या आपने मेरा प्रश्न पढ़ा है? मुझे आपके लिए अपना प्रश्न संपादित करना था।
मिकी

जवाबों:


215

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

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

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

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


23
इसलिए मालॉक का रिटर्न प्रकार चार था और शून्य नहीं था । धन्यवाद।
Michi

10
यह भी शुद्धिपत्र में उल्लेख किया गया है web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/...
ओपन स्कूल

18
आपको इस पुस्तक को उस इरेटा के बिना नहीं पढ़ना चाहिए जो आपके बगल में एक कागज पर छपी है।
लंडिन

4
@ मिकी - नहीं, वापसी का प्रकार था char*, नहीं char। दोनों बहुत अलग हैं।
पीट बेकर

20
@ हल: बिल्कुल। K & R को पढ़कर आप दो गुरुओं को सुन रहे हैं, जो पर्याप्त है ;-)
स्टीव जेसप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.