2009-11-11 17 views
8

मैं यह पता लगाने की कोशिश कर रहा हूं कि सी में निम्नलिखित कोड क्या है?जटिल सी कास्ट स्पष्टीकरण

((void(*)())buf)(); 

जहां 'buf' char सरणी है।

+5

"cdecl" नामक प्रोग्राम की तलाश करें। डाउनलोड करो। इसमें घोषणा पेस्ट करें। प्रबुद्ध हो। –

+0

@ पॉल: मैं कोशिश करूँगा और उम्मीद करता हूं कि यह मेरी मशीन को मार नहीं देगा! –

+1

यह कोड एक जेआईटी, या ओएस में गतिशील लिंकर/लोडर में उचित रूप से दिखाई दे सकता है। जैसा कि अन्य ने कहा है, यह डरावनी चीजें है, लेकिन केवल तभी जब आप इसे एक सामान्य अनुप्रयोग में सामना करते हैं। इसकी उचित जगह में, यह डरावनी चीजें नहीं है, केवल मुश्किल चीजें हैं। –

उत्तर

21

के ले एक समय में एक कदम करते हैं।

void(*)() 

यह एक ऐसे फ़ंक्शन के लिए सूचक है जो अनिर्दिष्ट तर्क लेता है और उसके पास कोई वापसी मूल्य नहीं होता है।

(void(*)())buf 

बस इस फ़ंक्शन पॉइंटर प्रकार पर buf को रोकता है। अंत में,

((void(*)())buf)(); 

इस फ़ंक्शन को कॉल करता है।

तो संपूर्ण कथन "को तर्क के बिना void फ़ंक्शन के पॉइंटर के रूप में व्याख्या करें और उस फ़ंक्शन को कॉल करें।"

+3

एक चरित्र बफर को किसी फ़ंक्शन में कास्ट करना और उसे बुला देना बुरा है। यह या तो स्वयं संशोधित कोड पर एक प्रयास है, या यह किसी प्रकार का शोषण करने का एक दुर्भावनापूर्ण इरादा है। किसी भी तरह से, हर कीमत पर इससे बचें। –

+0

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन क्या यह सूचक का मूल्य नहीं है (सरणी का पता) जिसे फ़ंक्शन के रूप में माना जाता है, सरणी की सामग्री नहीं? "बफ में मूल्य * की व्याख्या करें" थोड़ा सा लगता है जैसे आप कह रहे हैं कि सामग्रियों को फ़ंक्शन में पॉइंटर के रूप में व्याख्या किया जाता है। –

+3

-1 (वास्तव में नहीं): सी – pmg

9

यह void(*)() (एक फ़ंक्शन वापस करने/शून्य रहित और अनिर्दिष्ट तर्क लेने) के फ़ंक्शन पॉइंटर पर रहता है और इसे कॉल करता है।

एएनएसआई मानक वास्तव में सामान्य डेटा पॉइंटर्स के फ़ंक्शन पॉइंटर्स को कास्टिंग करने की अनुमति नहीं देता है, लेकिन आपका प्लेटफ़ॉर्म इसे अनुमति दे सकता है।

+0

आप फ़ंक्शन पॉइंटर में सरणी कैसे डाल सकते हैं ?? क्या कोई लेख है जो इसे समझाता है? –

+0

एक पॉइंटर किसी अन्य मूल्य की तरह बाइट्स का संग्रह है (जिसे इस प्रकार सी में वर्णों की सरणी के रूप में प्रस्तुत किया जा सकता है)। आप शायद प्रोग्राम में कहीं और पाएंगे कि इसके विपरीत किया गया था: 'char * buf = (char *) फ़ंक्शन; 'या कुछ समान। – Wernsey

+0

आप ऐसा कर सकते हैं क्योंकि यह सी है - आप जो चाहें कर सकते हैं। यह एक भयानक विचार है, लेकिन आप इसे कर सकते हैं। – Clyde

1

मुझे लगता है कि कई परिस्थितियों में, यह मशीन को दुर्घटनाग्रस्त करता है। अन्यथा, यह सरणी को उस फ़ंक्शन पर पॉइंटर के रूप में मानता है जो शून्य लौटाता है और उसे आमंत्रित करता है।

2

यह buf को फ़ंक्शन पॉइंटर में रखता है, जो अनिर्दिष्ट तर्क लेता है, और इसे कॉल करता है।

+1

-1 (वास्तव में नहीं): सी – pmg

+0

@pmg में अनिर्दिष्ट तर्क लेता है, धन्यवाद। मैंने जवाब से संपादित किया। –

4

यह buf को void (*)() पर टाइप करता है, जो उस कार्य के लिए सूचक होता है जो अनिर्धारित पैरामीटर लेता है और कुछ भी नहीं देता है। फिर यह उस पते पर फ़ंक्शन को कॉल करता है (दो दाएं कोष्ठक)।

+0

-1 (वास्तव में नहीं): सी – pmg

+0

@pmg, अच्छा बिंदु में अनिर्दिष्ट तर्क लेता है। –

0

फ़ंक्शन पॉइंटर को कॉल करता है। समारोह में कोई तर्क नहीं है।

Function Pointer - Wikipedia

+1

-1 (वास्तव में नहीं): फ़ंक्शन में सी – pmg

+0

में अनिर्दिष्ट तर्क हैं फ़ंक्शन में कोई तर्क नहीं है (दिया गया है)। फ़ंक्शन प्रकार में निर्दिष्ट पैरामीटर हैं। –

+0

अनुमोदित, अन्य उत्तरों दिए गए मैं पोस्ट को छोड़ दूंगा। – segy

2
 
((void(*)())buf)(); 
\------------/   cast `buf` to 
\---------/   type: pointer to function accepting a fixed but 
           unspecified number of arguments and 
           returning void 
\----------------/  and call that "function" 
+0

+1 आप पैरामीटर की अनिर्दिष्ट संख्या के बारे में सही हैं। यदि आपने एक उदाहरण के साथ स्पष्ट किया था, तो शायद आप अपनी अंतर्दृष्टि के लिए अधिक प्रशंसा प्राप्त कर चुके हैं :) – Andomar

1

आप "विशेषज्ञ सी प्रोग्रामिंग" एक अच्छा पढ़ने मिल सकती है - अगर मैं सही याद बात इस तरह का खोल, अध्याय में से एक में है। जब से मैंने इसे पढ़ा है, यह एक लंबा समय है, लेकिन मुझे याद है कि उस समय के प्रयास के लायक थे। http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298

5

जब मैं एक दिमागी दबाने वाली घोषणा में आता हूं तो मैं "cdecl" कमांड का उपयोग करता हूं। उदाहरण:

[[email protected]]$ cdecl 
Type `help' or `?' for help 
cdecl> explain (void(*)())buf 
cast buf into pointer to function returning void 

हालांकि ऐसे मामले भी मैं कहाँ चाहते हैं वहाँ एक उपकरण है कि "cdecl" के उत्पादन में बताते है कि कर रहे हैं:/

1

'cdecl' उपकरण है जो LSC का ऑनलाइन संस्करण नहीं है उल्लेख किया है कि आपको उपयोगी मिल सकता है: http://www.cdecl.org/

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