2010-03-30 17 views
11
#include<cstdio> 
#include<stdlib.h> 

int main() 
{ 
    char* ptr=NULL; 
    printf("%s",ptr); 
    return 0; 
} 

यह आउटपुट के रूप में प्रिंट करता है (शून्य)। उपर्युक्त नमूना कोड है। वास्तविक कोड में मुझे एक समारोह की वापसी के रूप में char * मिलता है और मैं लॉगिंग के लिए वर्ण स्ट्रिंग मुद्रित करना चाहता हूं। हालांकि, एनयूएलएल उस समारोह का वैध वापसी मूल्य भी है और इसलिए मैं सोच रहा हूं कि चरित्र स्ट्रिंग को मुद्रित करने से पहले एक शून्य जांच की आवश्यकता है या नहीं?निम्नलिखित सी कोड सुरक्षित है?

char* ptr=someFuncion(); 
// do i need the following if statement? 
if(ptr!=NULL) 
{ 
    printf("%s",ptr); 
} 

मैं बस यह सुनिश्चित करें कि उत्पादन एक ही यानी हो सकता है अगर ptr = शून्य तो उत्पादन सभी प्लेटफार्मों और संकलनकर्ता और इसके बाद के संस्करण कोड (बिना अगर बयान) पर (शून्य) होना चाहिए किसी पर दुर्घटना नहीं होगा होना चाहता हूँ सी मानक संगत मंच।

संक्षेप में, उपरोक्त कोड (यदि कथन के बिना) मानक संगत है?

आपकी मदद और धैर्य :)

सादर

संदेह आप कार्यान्वयन विवरण पर निर्भर नहीं होना चाहिए और एक अतिरिक्त (ptr != NULL) प्रदर्शन के मामले में लाली

+0

आपके कोड को प्रदान करने वाला '' हेडर क्या है? आपका कोड एक ऐसे फ़ंक्शन को शून्य पॉइंटर पास करके अपरिभाषित व्यवहार का आह्वान करता है जो किसी की अपेक्षा नहीं करता है। कुछ भी हो सकता है - इसमें यह गलती से काम कर सकता है, ज्यादातर। –

+0

ठीक है, मुझे मिल गया। इस तरह के "रीयलटाइम" मदद के लिए सभी को धन्यवाद :)) – ghayalcoder

उत्तर

21

संक्षेप में, इसके बाद के संस्करण कोड मानक संगत ( अगर बयान के बिना) है?

सं आईएसओ/आईईसी 9899: 1999 (सी मानक दस्तावेज़) यदि ptr शून्य है, इसलिए व्यवहार अपरिभाषित है क्या होना चाहिए, इस बारे में कोई बयान देता। आपके द्वारा उपयोग की जाने वाली लाइब्रेरी केवल क्रैश होने की बजाय आपको कुछ सहायक आउटपुट ("(शून्य)") देने के लिए पर्याप्त अनुकूल थी।

न्यूल के लिए स्पष्ट जांच शामिल करें।

5

के लिए धन्यवाद - यह भी अच्छा कोडन अभ्यास है।

7

क्या आपका ऐसा कुछ मतलब है?

 
    char* result = foo(); 
    printf ("result is %s\n", (result ? result : "NULL")); 
+0

मुझे यह पसंद आया, धन्यवाद :) – ghayalcoder

1

आमतौर पर आप मेरे अनुभव में, अगर कथन के बिना स्पष्ट हो जाएंगे, हालांकि मैं आदत से जो कुछ भी दिखाता हूं उसे करने से बचता हूं ... यह एक लंबा समय रहा है, लेकिन आईआईआरसी सूर्य कंपाइलर का उपयोग करता हूं काम करने के लिए कुछ या हर समय दुर्घटना हो जाएगी यदि आपने प्रिंट नंबर() में एक पूर्ण चार * पास किया है, तो चेक को शामिल करना इतना आसान और सुरक्षित है ... मैं नोट का उपयोग करने के बारे में नोट में फेंकने वाला था मैक्रो-फॉर्म, लेकिन मुझे लगता है कि मैंने 30 सेकंड में 3 अन्य लोगों की तरह इसे पीटा है क्योंकि मैंने इसे टाइप करना शुरू कर दिया है :)

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