2016-10-19 13 views
7

के बीच अंतर मैं कोड के निम्नलिखित भाग को समझने की कोशिश कर रहा हूं, लेकिन मैं "\ 0" और '\ 0' के बीच उलझन में हूं। मुझे इसकी मूर्खता है लेकिन कृपया मेरी मदद करें" 0" और ' 0'

#define MAX_HISTORY 20 

    char *pStr = "\0"; 
    for(x=0;x<MAX_HISTORY;x++){ 
     str_temp = (char *)malloc((strlen(pStr)+1)*sizeof(char)); 
     if (str_temp=='\0'){ 
      return 1; 
    } 
    memset(str_temp, '\0', strlen(pStr)); 
    strcpy(str_temp, pStr); 

अग्रिम धन्यवाद

+0

'char * pStr =" \ 0 "; 'मुझे लगता है कि यह ऐसा नहीं है जो आपको लगता है। आप एक सूचक घोषित करते हैं और इसमें कुछ लिखते हैं। वह पता होगा जो यह इंगित करता है। वहाँ 'malloc' करो और बाद में आवंटित स्मृति भरें। या आप वहां एक चार सरणी का उपयोग कर सकते हैं। –

+2

@KamiKaze मुझे लगता है कि 'char * pStr = "\ 0";' आप जो सोचते हैं वह नहीं है। यह एक सूचक घोषित करता है जिसका मूल्य स्ट्रिंग अक्षर ** का ** पता है जिसमें दो नल बाइट शामिल हैं। सही होने के लिए malloc करने की कोई ज़रूरत नहीं है। –

+0

@ जीन-बैपटिस्ट युनस एमह, तुमने मुझे वहां सोचने के लिए कहा। स्मृति का जीवनकाल क्या है जिसमें दो नल बाइट रहते हैं? –

उत्तर

8

डबल कोट्स स्ट्रिंग अक्षर बनाते हैं। तो "\0" एक स्ट्रिंग अक्षर है जिसमें सिंगल कैरेक्टर '\0' है, साथ ही टर्मिनेटर के रूप में दूसरा। यह एक खाली स्ट्रिंग लिखने का मूर्ख तरीका है ("" बेवकूफ तरीका है)।

एकल उद्धरण चिह्न चरित्र शाब्दिक के लिए हैं, इसलिए '\0' एक int आकार के कोड में की 0.

एनआईटी एन्कोडिंग मूल्य के साथ चरित्र का प्रतिनिधित्व मूल्य है:

  • वापसी डाली न करें सी malloc() का मूल्य सी
  • sizeof (char) द्वारा आवंटन स्केल न करें, यह हमेशा 1 होता है इसलिए इसमें कोई मूल्य नहीं होता है।
  • पॉइंटर्स पूर्णांक नहीं हैं, आपको आमतौर पर NULL के विरुद्ध तुलना करना चाहिए।
  • कोड की पूरी संरचना को कोई समझ नहीं आता है, एक लूप में आवंटन होता है लेकिन पॉइंटर को फेंक दिया जाता है, बहुत सारी मेमोरी लीक होती है।
+1

स्मृति रिसाव के बारे में नाइट करना न भूलें (लूप में आवंटित स्मृति के संदर्भ को ओवरराइट करता है)। –

+1

मॉलोक में 'आकार (चार)' का उपयोग न करने के लिए एक बहुत ही व्यक्तिपरक शैली की राय है, मुझे समझ में नहीं आता कि लोग यह टिप्पणी क्यों करते रहते हैं। लोग आकार (char) को स्पष्ट रूप से टाइप कर रहे हैं क्योंकि वे लगातार कोडिंग शैली चाहते हैं चाहे कोई भी प्रकार न हो और हमेशा मॉलोक को 'malloc (n * sizeof (type)) के रूप में कॉल करें। यह स्वयं-दस्तावेज़ कोड का मूल्य जोड़ता है। इसके खिलाफ बहस करने के लिए यह कहने की तरह है कि हमें 'char * ptr = malloc (n * sizeof (* ptr)) नहीं लिखना चाहिए, लेकिन इसे 'char * ptr = malloc (n)' के रूप में फिर से लिखना चाहिए, लेकिन केवल तभी चार है – Lundin

+0

यह एक खाली स्ट्रिंग बनाने का मूर्ख तरीका नहीं है, क्योंकि यह केवल खाली स्ट्रिंग नहीं बना रहा है। यह सिर्फ एक स्ट्रिंग अक्षर बनाता है जो एक स्ट्रिंग नहीं है, 6.4.5/6 नोट 78 –

10

में वे अलग हैं।

"\0" एक स्ट्रिंग शाब्दिक जो लगातार दो 0 की है और मोटे तौर पर के बराबर है है:

const char a[2] = { '\0', '\0' }; 

'\0' मूल्य 0. के साथ एक int है तुम हमेशा 0 भी आप '\0' उपयोग करने की आवश्यकता कर सकते हैं।

6

\0 शून्य टर्मिनेटर चरित्र है।

"\0"{'\0', '\0'} जैसा ही है। यह एक भ्रमित प्रोग्रामर द्वारा लिखी गई एक स्ट्रिंग है जो समझ में नहीं आता है कि स्ट्रिंग अक्षर हमेशा शून्य समाप्त हो जाते हैं। सही लिखित कोड "" होगा।

लाइन if (str_temp=='\0') बकवास है, यह होना चाहिए था। अब जैसा होता है, \0 0 के बराबर है, जो एक शून्य सूचक स्थिर है, इसलिए कोड भाग्य द्वारा काम करता है।

एक स्ट्रिंग के लेना पहला चरित्र बहुत सार्थक नहीं है। आपको स्ट्रिंग लम्बाई शून्य मिलेगी।

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