2010-04-07 12 views
6

मैं स्क्रैच से सी ++ सीख रहा हूं, और इस तरह मेरे पास सी ++ में सी की विशेषज्ञ समझ नहीं है, आप जो कुछ भी शून्य सूचक नहीं डाल सकते हैं, और मैं इसके पीछे कारणों को समझता हूं। हालांकि, मुझे पता है कि सी में, आप कर सकते हैं। इसके लिए संभावित कारण क्या हैं? ऐसा लगता है कि यह प्रकार की सुरक्षा में एक बड़ा छेद है, जो (मेरे लिए) एक बुरी चीज की तरह लगता है।शून्य पॉइंटर कास्टिंग करने के क्या कारण हैं?

उत्तर

13

आप दोनों भाषाओं में एक अन्य सूचक में डाल सकते हैं। शायद आप अंतर्निहित मतलब था।

सी में यह बहुत सुविधाजनक है कि इसके बारे में स्पष्ट नहीं होना चाहिए। सी ++ में हमारे पास टेम्पलेट्स हैं, इसलिए जेनेरिक कोड लिखने के लिए void* कास्टिंग और व्हाट्नॉट की आवश्यकता नहीं है। सी में कोई विकल्प नहीं है। एक सामान्य कंटेनर को ऑब्जेक्ट्स में void* रखना होता है, और mydata* d = node; बार-बार कहना बहुत आसान होता है तो यह mydata* d = (mydata*)node; है।

तो यह आपके जैसा कहा गया है। सामान्य रूप से सी प्रकार की सुरक्षा में सी ++ में जितना जोर दिया गया था, विशेष रूप से जब यह void* पर आया क्योंकि यह किसी भी चीज़ के लिए एक सामान्य जेनेरिक पॉइंटर होने का अनुमान लगाया गया था। सी ++ में इसकी कोई आवश्यकता नहीं है, इसलिए जब आप इससे निपट रहे हों तो बेहतर इसे स्पष्ट करें।

+0

महान उत्तर, धन्यवाद! – Maulrus

0

एक कारण: यदि आप structs की सरणी को सॉर्ट करने के लिए sort का उपयोग करते हैं, और आपके पास दो structs के लिए तुलनात्मक फ़ंक्शन है, तो आपको संरचना के सदस्यों तक पहुंचने के लिए पॉइंटर्स को पॉइंटर्स को पॉइंटर्स पर डालना होगा।

1

[void * सी में पॉइंटर कास्टिंग] के संभावित कारण क्या हैं? क्या यह सुरक्षा सुरक्षा में एक विशाल छेद नहीं है?

पॉलिमॉर्फिज्म, उर्फ ​​जेनेरिक प्रोग्रामिंग का समर्थन करने का यह एकमात्र संभव तरीका है। बनाने के लिए कोई और तरीका नहीं है, उदाहरण के लिए, एक सामान्य हैश तालिका। सी में पॉलिमॉर्फिज्म जंगली रूप से असुरक्षित है, लेकिन यह एकमात्र बहुरूपता है।

खुश रहें कि सी ++ में पैरामीट्रिक पॉलिमॉर्फिज्म (टेम्पलेट्स के कई कार्यों में से एक है)।

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