2013-05-31 8 views
8

मैं सी में कोड के इस टुकड़े है:सी में यह फ़ॉर्म सही क्यों है?

void f(void *x) { 
    printf(">>> %p\n", x); 
} 

int main() { 

    f NULL; 
    return 0; 
} 

मुझे लगता है कि शून्य की परिभाषा के लिए है, लेकिन मैं अपने संदेह स्पष्ट करने के लिए एक स्पष्टीकरण चाहते हैं।

+0

आपको वास्तव में क्या पसंद नहीं है? –

+5

iirc NULL एक # परिभाषित किया गया है ((शून्य *) 0), इसलिए जब आपके पास इसकी प्रतिलिपि होती है तो f ((void *) 0) फ़ंक्शन – Daboyzuk

+0

फ़ंक्शन के पैरामीटर के रूप में काम करता है, पहली बार यह है कि मैं इसे देखता हूं फॉर्म 'एफ न्यूल' की तरह। – Kyrol

उत्तर

9

तो NULL((void *)0) या (0) के रूप में परिभाषित किया गया है, तो यह f ((void *)0) या f (0) है, जो उचित समारोह कॉल कर रहे हैं करने के लिए फैलता है। संकलन के दौरान गैर-संश्लेषित कुछ भी के लिए कोड त्रुटियां।

+0

समझेंगे, मैंने डाउनवॉट किया है, और यह ध्यान देने के बाद मेरा डाउनवोट हटा दिया है कि यह "सोमवार सुबह" पल था ... –

+0

@ जोहान्सचैब-लीटब आह, ठीक है। समझा। –

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। – Kyrol

2

सी NULL में अक्सर इस प्रकार परिभाषित किया गया है:

#if !defined(NULL) 
    #define NULL ((void*)0) 
#endif 

इस मामले है तो NULL सिर्फ एक विशेष सूचक है, और आप उदाहरण के काम करता है।

+0

नहीं, सी मानक परिभाषित नहीं करता है कि एनयूएलएल को कैसे परिभाषित किया जाना चाहिए। –

+5

इसके अलावा, पता * * के लिए 'NULL' सूचक नहीं है *। इसके बजाय, * सूचक संकेत 0 *, जब एक सूचक संदर्भ में सामना किया, शून्य सूचक है। शून्य सूचक का * वास्तविक * मान कार्यान्वयन-विशिष्ट है और कुछ भी हो सकता है। – Jon

+2

पर्याप्त मेला, मानक कहता है कि एनयूएलएल की परिभाषा कार्यान्वयन विशिष्ट है। हालांकि अनुभाग 6.3.2.3 भाग 3 में, http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf में। यह कहता है कि एक '0' कास्ट (शून्य *) को शून्य सूचक स्थिरांक कहा जाता है। – jbr

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