2011-01-20 13 views
6

मैं एक परियोजना पर काम कर रहा हूँ और मैं इस त्रुटि है कि मुझे परियोजना को पूरा करने की अनुमति नहीं होगी भर में आते हैं। जब मैं अपने संकेत दिए गए एक वस्तु है कि कार्यक्रम के निष्पादन के दौरान किया जाएगा करने के लिए बात करने के लिए में से एक को प्रारंभ और मैं इसे NULL को आरंभ कर देगा। फिर जब मैं देख रहा हूँ कि यह क्या सेट किया गया है यह nil का एक मान देता है की जाँच करें। ऐसी चीज कैसे संभव है? मुझे विश्वास नहीं था कि सीएल में मौजूद नील पॉइंटर्स मौजूद हैं? क्या इसके आसपास कोई रास्ता है?(शून्य) सी में सूचक/C++

struct order_line *front = NULL; 
... 
printf("Head: %p\n", front); // prints -> Head: (nil) 
+1

आप अपने सूचक मूल्य की जांच कैसे करते हैं? Debugguer? प्रिंटफ? यह सिर्फ आपके टूल द्वारा नल पॉइंटर का प्रतिनिधित्व करने की समस्या हो सकती है। –

+3

"शून्य" का अर्थ यहां क्या है? 0? उद्देश्य सी? –

+0

मैं इसे जाँच करने के लिए (% पी) printf का उपयोग कर रहा है और यह नियमित रूप से सी में है नहीं उद्देश्य – CF711

उत्तर

9

printf में %p एक सूचक प्रकार स्वरूपों। यह एक अशक्त-सूचक भेद और प्रिंट (nil) क्योंकि यह एक सूचक के संदर्भ में एक विशेष मूल्य है जा रहा है। यदि आप एक नल पॉइंटर के लिए उत्पादन 0 चाहते हैं, एक पूर्णांक के लिए सूचक डाली और इसके बजाय %d का उपयोग करें:

printf("Head: %d\n", (int) front); 

मूल जवाब यह अभी भी उपयोगी हो सकता है के रूप में:

NULL एक मैक्रो 0 या के रूप में परिभाषित किया गया है ((void *) 0), इसलिए यदि आप NULL के लिए सूचक सेट यह वास्तव में 0 के लिए यह करने के समान ही है। यह शून्य पॉइंटर्स घोषित करने के उद्देश्य से काम करता है क्योंकि पता 0 पर स्मृति आपके प्रोग्राम को आवंटित नहीं की जाएगी।

+0

नहीं, मैं वास्तव में त्रुटि के रूप में शून्य हो रहा हूँ। – CF711

+0

@ क्रिस क्या आपको शून्य देता है? क्या हम कुछ कोड देख सकते हैं? – marcog

+2

'शून्य' सी में मौजूद नहीं है जब तक कि आप इसे परिभाषित नहीं करते। –

0

मुझे लगता है कि नहीं के बराबर मानते हुए कर रहा हूँ कि आपके डिबगर तुमसे कह रहा है। अधिकांश कंपाइलर्स में नल अभी भी 0 को एड को परिभाषित करता है ताकि नाम इतना महत्वपूर्ण न हो।

+0

मैं न्यूल की जांच करने के लिए इसके अंदर एक चेक चला रहा हूं लेकिन जब मैं जांचता हूं कि यह क्या इंगित कर रहा है (शून्य)। – CF711

+5

टाइपेडफ 0 से 0? यह किसी भी टाइपिफ नहीं है जिसे मैंने कभी सुना है। : P –

+0

हाँ #define मैं क्या मतलब – rerun

0

दूसरों के रूप में कहा है, वहाँ सी

में शून्य सूचक के रूप में ऐसी कोई बात हो सकता है आपके स्मृति आवंटन विफल रहता है, 0 के कारण सूचक को सौंपा जा रहा है।

3

जब आप एक सूचक printf("%p", somePtr) का उपयोग करके प्रिंट, यह एक कार्यान्वयन से परिभाषित तरीके में मुद्रित रूप में POSIX printf specification से इस उद्धरण के प्रति (समान शब्दों C99 विनिर्देश भी मौजूद है) है।

तर्क शून्य के लिए एक सूचक होना चाहिए। सूचक के मूल्य को कार्यान्वयन-निर्भर तरीके से, मुद्रक पात्रों के अनुक्रम में परिवर्तित किया जाता है।

मुझे लगता है कि इसका मतलब है कि अगर सूचक NULL है, यह यह लेकिन यह चाहता है प्रिंट, nil या 0x00000000 या 0 के रूप में यह मुद्रण करना शामिल है।

+0

अच्छी तरह से मैं ही कभी (शून्य) हो रही अंत है, लेकिन किसी भी तरह से, क्योंकि शून्य के लिए मेरे चेकों इस पकड़ने नहीं कर रहे हैं इस समस्या को हल पाने के लिए है और यह मेरे कार्यक्रम – CF711

+0

फॉल्ट का बना हुआ है @ क्रिस: इसे एक पूर्णांक प्रकार में कनवर्ट करें और इसे पॉइंटर के बजाय पूर्णांक के रूप में प्रिंट करें (यह एक कार्यान्वयन-परिभाषित व्यवहार भी है लेकिन आमतौर पर समर्थित है)। ' 'में परिभाषित' uintptr_t' प्रकार आपको मदद कर सकता है। – dreamlax

0

यदि आपका प्रश्न सूचक मूल्य को एनयूएलएल की तुलना करने के बारे में है तो printf() द्वारा मुद्रित मान से कोई फर्क नहीं पड़ता। यदि आप इसके लिए (ptr == NULL) अभी भी कर सकते हैं।

    ptr = (nil) और NULL = (nil) => ptr = NULL :)

किसी अन्य कारण के कारण आपको जो त्रुटि मिल रही है उसे जरूरी है।

0

उपयोग

printf("Head: %s, %d, %p\n", front, front, front); 

मुद्रित करने के लिए Head: (null), 0, (nil)

धन्यवाद Packia

0

पूर्णांक के साथ संरचना सूचक कास्टिंग के बाद, इसके साथ की उम्मीद हालत प्रदान करता है अगर बयान ..

printf("The address of the variable is---ps->p---After Deletion-- %p \n",ps->p); 
printf("The address of the variable is---ps->p---After Deletion-- %d \n",(int)ps->p); 
if((int)ps->p){ 
printf("Again in Free\n"); 
doFree((void **)&ps->p); 
} 

आउटपुट: -

चर का पता है --- ps-> पी --- Deletion-- शून्य चर का पता करने के बाद --- ps-> पी --- Deletion-- 0 के बाद

है

यह स्थिति के लिए झूठी मूल्यांकन करेगा।

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