2010-04-09 12 views
6

उन्होंने कहा कि यह अभिव्यक्ति सी में मान्य है, और यह एक समारोह बुला मतलब यह है कि:गूढ़ रहस्य (* (शून्य (*)()) 0)()

(*(void(*)())0)(); 

कोई स्पष्ट रूप से व्याख्या कर सकते हैं क्या यह अभिव्यक्ति का मतलब ?

मैंने इसे संकलित करने की कोशिश की और आश्चर्यचकित हुआ कि इसका कोई त्रुटि नहीं हुई।

+2

यह एक छिपी हुई विशेषता को कॉल करने के लिए अजीब है। –

+0

"यह अपरिभाषित व्यवहार नहीं है ... यह एक विशेषता है!"। नहीं, यह अपरिभाषित व्यवहार है। –

उत्तर

18

कदम दर कदम:

void(*)()  // a pointer-to-function type, taking unspecified parameters 
        // and returning nothing. 
    (void(*)())0  // a null pointer of that pointer-to-function type 
(*(void(*)())0)  // dereference that pointer 
(*(void(*)())0)(); // and call it with no parameters 

कोड व्यवहार अपरिभाषित है, यह हूँ शायद किसी प्रकार की अवैध पहुंच/सेगफॉल्ट के साथ दुर्घटनाग्रस्त हो।

+0

@ स्टेव जेसॉप: विस्तार के उत्तर के लिए धन्यवाद – NguyenDat

+2

दरअसल उस कोड में आपके द्वारा संकलित किए जा रहे प्लेटफ़ॉर्म के लिए विशिष्ट व्यवहार होगा। इसे कुछ प्लेटफार्मों के लिए स्पष्ट रूप से परिभाषित किया जा सकता है, और दूसरों पर अवैध। मैंने हाल ही में एक माइक्रो नियंत्रक खरीदा है, और जब यह सक्रिय हो जाता है, तो यह स्मृति में पता 0 पर शुरू कोड निष्पादित करता है। तो वह कोड कार्यक्रम की शुरुआत में कूद जाएगा। – Ponkadoodle

+2

ठीक है, कि माइक्रो नियंत्रक उन मामलों में से एक है जिसका अर्थ है कि यह केवल * संभवतः क्रैश - संभावना है कि nguyendat एक मंच का उपयोग कर रहा है जहां यह कम नहीं होगा ;-) जब मैं कहता हूं कि "अनिर्धारित व्यवहार" मेरा मतलब है , हमेशा के रूप में, सी मानक द्वारा अपरिभाषित। विशेष कार्यान्वयन गारंटी दे सकता है कि वे अनिर्धारित व्यवहार के विशेष मामलों में क्या करेंगे। –

6

आप किसी फ़ंक्शन में पॉइंटर बना रहे हैं और फिर उसे कॉल कर रहे हैं। मैं इसे एक छिपी हुई विशेषता नहीं कहूंगा लेकिन अपरिभाषित व्यवहार।

मूल रूप से आप इस लेकिन क्या कर रहे हैं के बजाय पता 0 के साथ:

void test() { } 

void(*pfn)() = test; 
(*pfn)(); 
3

यह NULL में आयोजित एक समारोह के लिए एक सूचक है।

void(*)() किसी फ़ंक्शन में पॉइंटर की परिभाषा है जो कोई तर्क नहीं लेती है जो कुछ भी वापस नहीं करती है; आप इसे नाम कर सकते हैं:

typedef void(*my_func)(); 

तो अपने उदाहरण में आप एक डाली मिल गया है:

(my_func)0 एक my_func करने के लिए एक समारोह सूचक पैदावार, वह है, एक समारोह में कुछ भी नहीं ले रही है और कुछ भी नहीं लौटने।

फिर आप इसे प्रमुख तारांकन (जो अनावश्यक, afaik) के साथ अव्यवस्थित करते हैं, और फिर आप इसे कॉल करते हैं।

तो आप किसी फ़ंक्शन को कोई तर्क नहीं ले रहे हैं और पता शून्य पर रहने वाले कुछ भी नहीं लौट रहे हैं।

यह (आमतौर पर) अपरिभाषित व्यवहार है, और कई प्लेटफ़ॉर्म पर तुरंत क्रैश हो जाएगा। (यह अपरिभाषित व्यवहार करता है, तो आप पता शून्य में आयोजित एक समारोह में कहें, कम से कम मुझे लगता है कि नहीं होता यह था नहीं है।)

2

प्रति कोष्ठक को तोड़ दें।

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

लाइन (void(*)()) का अर्थ है एक फ़ंक्शन जो शून्य लौटाता है।

पिछले छोटा सा, शुरुआत में (* और 0) संकलक कि समारोह के पते 0.

तो मूल रूप से सूचक स्थान पर झूठ कॉल करने के लिए कह रहा है, तो आप बुला रहे हैं, जो भी हो पर स्थित है कोई पैरामीटर के साथ पता 0। आमतौर पर बहुत सुरक्षित नहीं है। :)

0

एक एम्बेडेड वातावरण में, सिस्टम रीसेट दिनचर्या को कॉल करने का एक तरीका हो सकता है।

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