मैं यह पता लगाने की कोशिश कर रहा हूं कि सी में निम्नलिखित कोड क्या है?जटिल सी कास्ट स्पष्टीकरण
((void(*)())buf)();
जहां 'buf' char
सरणी है।
मैं यह पता लगाने की कोशिश कर रहा हूं कि सी में निम्नलिखित कोड क्या है?जटिल सी कास्ट स्पष्टीकरण
((void(*)())buf)();
जहां 'buf' char
सरणी है।
के ले एक समय में एक कदम करते हैं।
void(*)()
यह एक ऐसे फ़ंक्शन के लिए सूचक है जो अनिर्दिष्ट तर्क लेता है और उसके पास कोई वापसी मूल्य नहीं होता है।
(void(*)())buf
बस इस फ़ंक्शन पॉइंटर प्रकार पर buf को रोकता है। अंत में,
((void(*)())buf)();
इस फ़ंक्शन को कॉल करता है।
तो संपूर्ण कथन "को तर्क के बिना void
फ़ंक्शन के पॉइंटर के रूप में व्याख्या करें और उस फ़ंक्शन को कॉल करें।"
एक चरित्र बफर को किसी फ़ंक्शन में कास्ट करना और उसे बुला देना बुरा है। यह या तो स्वयं संशोधित कोड पर एक प्रयास है, या यह किसी प्रकार का शोषण करने का एक दुर्भावनापूर्ण इरादा है। किसी भी तरह से, हर कीमत पर इससे बचें। –
अगर मैं गलत हूं, तो मुझे सही करें, लेकिन क्या यह सूचक का मूल्य नहीं है (सरणी का पता) जिसे फ़ंक्शन के रूप में माना जाता है, सरणी की सामग्री नहीं? "बफ में मूल्य * की व्याख्या करें" थोड़ा सा लगता है जैसे आप कह रहे हैं कि सामग्रियों को फ़ंक्शन में पॉइंटर के रूप में व्याख्या किया जाता है। –
-1 (वास्तव में नहीं): सी – pmg
यह void(*)()
(एक फ़ंक्शन वापस करने/शून्य रहित और अनिर्दिष्ट तर्क लेने) के फ़ंक्शन पॉइंटर पर रहता है और इसे कॉल करता है।
एएनएसआई मानक वास्तव में सामान्य डेटा पॉइंटर्स के फ़ंक्शन पॉइंटर्स को कास्टिंग करने की अनुमति नहीं देता है, लेकिन आपका प्लेटफ़ॉर्म इसे अनुमति दे सकता है।
आप फ़ंक्शन पॉइंटर में सरणी कैसे डाल सकते हैं ?? क्या कोई लेख है जो इसे समझाता है? –
एक पॉइंटर किसी अन्य मूल्य की तरह बाइट्स का संग्रह है (जिसे इस प्रकार सी में वर्णों की सरणी के रूप में प्रस्तुत किया जा सकता है)। आप शायद प्रोग्राम में कहीं और पाएंगे कि इसके विपरीत किया गया था: 'char * buf = (char *) फ़ंक्शन; 'या कुछ समान। – Wernsey
आप ऐसा कर सकते हैं क्योंकि यह सी है - आप जो चाहें कर सकते हैं। यह एक भयानक विचार है, लेकिन आप इसे कर सकते हैं। – Clyde
मुझे लगता है कि कई परिस्थितियों में, यह मशीन को दुर्घटनाग्रस्त करता है। अन्यथा, यह सरणी को उस फ़ंक्शन पर पॉइंटर के रूप में मानता है जो शून्य लौटाता है और उसे आमंत्रित करता है।
यह buf
को फ़ंक्शन पॉइंटर में रखता है, जो अनिर्दिष्ट तर्क लेता है, और इसे कॉल करता है।
-1 (वास्तव में नहीं): सी – pmg
@pmg में अनिर्दिष्ट तर्क लेता है, धन्यवाद। मैंने जवाब से संपादित किया। –
यह buf
को void (*)()
पर टाइप करता है, जो उस कार्य के लिए सूचक होता है जो अनिर्धारित पैरामीटर लेता है और कुछ भी नहीं देता है। फिर यह उस पते पर फ़ंक्शन को कॉल करता है (दो दाएं कोष्ठक)।
-1 (वास्तव में नहीं): सी – pmg
@pmg, अच्छा बिंदु में अनिर्दिष्ट तर्क लेता है। –
फ़ंक्शन पॉइंटर को कॉल करता है। समारोह में कोई तर्क नहीं है।
((void(*)())buf)(); \------------/ cast `buf` to \---------/ type: pointer to function accepting a fixed but unspecified number of arguments and returning void \----------------/ and call that "function"
+1 आप पैरामीटर की अनिर्दिष्ट संख्या के बारे में सही हैं। यदि आपने एक उदाहरण के साथ स्पष्ट किया था, तो शायद आप अपनी अंतर्दृष्टि के लिए अधिक प्रशंसा प्राप्त कर चुके हैं :) – Andomar
आप "विशेषज्ञ सी प्रोग्रामिंग" एक अच्छा पढ़ने मिल सकती है - अगर मैं सही याद बात इस तरह का खोल, अध्याय में से एक में है। जब से मैंने इसे पढ़ा है, यह एक लंबा समय है, लेकिन मुझे याद है कि उस समय के प्रयास के लायक थे। http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298
जब मैं एक दिमागी दबाने वाली घोषणा में आता हूं तो मैं "cdecl" कमांड का उपयोग करता हूं। उदाहरण:
[[email protected]]$ cdecl
Type `help' or `?' for help
cdecl> explain (void(*)())buf
cast buf into pointer to function returning void
हालांकि ऐसे मामले भी मैं कहाँ चाहते हैं वहाँ एक उपकरण है कि "cdecl" के उत्पादन में बताते है कि कर रहे हैं:/
'cdecl' उपकरण है जो LSC का ऑनलाइन संस्करण नहीं है उल्लेख किया है कि आपको उपयोगी मिल सकता है: http://www.cdecl.org/
"cdecl" नामक प्रोग्राम की तलाश करें। डाउनलोड करो। इसमें घोषणा पेस्ट करें। प्रबुद्ध हो। –
@ पॉल: मैं कोशिश करूँगा और उम्मीद करता हूं कि यह मेरी मशीन को मार नहीं देगा! –
यह कोड एक जेआईटी, या ओएस में गतिशील लिंकर/लोडर में उचित रूप से दिखाई दे सकता है। जैसा कि अन्य ने कहा है, यह डरावनी चीजें है, लेकिन केवल तभी जब आप इसे एक सामान्य अनुप्रयोग में सामना करते हैं। इसकी उचित जगह में, यह डरावनी चीजें नहीं है, केवल मुश्किल चीजें हैं। –