2008-09-08 14 views

उत्तर

22

के बीच अंतर के बाद से आप पहले से ही आकार घोषित है, दो घोषणाओं बिल्कुल बराबर हैं। हालांकि, अगर आप आकारों का उल्लेख नहीं है, जैसा कि आप देख सकते हैं कि पहले घोषणा एक बड़ा स्ट्रिंग बनाता है:

char a[] = "a\0"; 
char b[] = "a"; 

printf("%i %i\n", sizeof(a), sizeof(b)); 

प्रिंट

3 2 

इसका कारण यह है दो nulls के साथ एक छोर (स्पष्ट एक और निहित एक) जबकि बी केवल निहित एक के साथ समाप्त होता है।

1

जब तक कि मैं गलत नहीं हूं, पहला 2 वर्णों को 0 ('0' और टर्मिनेटर जो हमेशा वहां रहता है, और बाकी को छूटेगा, और अंतिम केवल 1 char (टर्मिनेटर) प्रारंभ करेगा।

+0

सरणी का पिछला बाइट शून्य बाइट भी होगा। –

3

के रूप में अन्य लोगों ने बताया है, "\ 0" एक समाप्त '\ 0' चरित्र है, तो संकेत मिलता है "" वास्तव में दो अशक्त पात्रों के साथ सरणी initializes।

कुछ अन्य answerers निहित है कि यह "एक ही ", लेकिन वह बहुत सही नहीं है कोई व्यावहारिक अंतर हो सकता है -।। जब तक एक ही रास्ता सरणी एक सी स्ट्रिंग पहले अक्षर के साथ शुरुआत के रूप में यह संदर्भित करने के लिए किया जाता है प्रयोग किया जाता है लेकिन ध्यान दें कि वे वास्तव में दो का परिणाम है विभिन्न स्मृति initalizati ओएनएस, विशेष रूप से वे भिन्न होते हैं कि स्ट्र [1] निश्चित रूप से शून्य है, या संकलित, ओएस, और अन्य यादृच्छिक कारकों के आधार पर कुछ भी हो सकता है (और कुछ भी हो सकता है)। सरणी के कुछ उपयोग हैं (शायद उपयोगी नहीं, लेकिन फिर भी) जिसमें अलग-अलग व्यवहार होंगे।

+0

प्रश्न के संदर्भ में, जहां सरणी का आकार निर्दिष्ट किया गया है, परिणाम समान हैं - अक्षर '' '' के बाद 31 नल बाइट्स, '' \ 0'' '। केवल एक unsized सरणी के संदर्भ में एक अंतर है। 'और' Str [32] = "";; 'और जोर देते हुए कर रहे हैं कि इन एक संकलक त्रुटि उत्पन्न करनी चाहिए –

-4

कोई अंतर नहीं है। वे दोनों अविकसित प्रतीक पर एक कंपाइलर त्रुटि उत्पन्न करेंगे। : पी

+0

मुमकिन है, आप सवाल जहां कोड था' Str [32] = "\ 0" के मूल संस्करण की बात कर रहे । यह निश्चित रूप से संदर्भ पर निर्भर करता है। यदि 'परिभाषा' के रूप में माना जाता है (जैसा कि वे प्रश्न के संशोधित संस्करण में हैं), तो प्रकार ('char') गायब था। आप 'चार मान तो * Str [33];' एक पूर्व परिभाषा के रूप में, तो दोनों सार्थक हैं (लेकिन तार अलग हैं की दिशा में रखे) - लेकिन क्या जवाब के बाकी मान से अलग। यह उत्तर सहायक नहीं है क्योंकि यह क्यों नहीं समझाता है। –

16

ठीक है, दो मामलों मानते हैं इस प्रकार है (संकलक त्रुटियों से बचने के):

char str1[32] = "\0"; 
char str2[32] = ""; 

के रूप में लोगों को कहा है, str1 दो अशक्त पात्रों के साथ आरंभ नहीं हो जाता:

char str1[32] = {'\0','\0'}; 
char str2[32] = {'\0'}; 

हालांकि , सी और सी ++ मानक दोनों के अनुसार, यदि किसी सरणी का भाग प्रारंभ किया गया है, तो सरणी के शेष तत्व डिफ़ॉल्ट रूप से प्रारंभ किए जाते हैं। एक चरित्र सरणी के लिए, शेष वर्ण सब शून्य प्रारंभ (अर्थात अशक्त अक्षर) होते हैं, इसलिए सरणियों वास्तव में के रूप में प्रारंभ कर रहे हैं:

char str1[32] = {'\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0'}; 
char str2[32] = {'\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0'}; 

तो, अंत में, वहाँ वास्तव में दोनों के बीच कोई अंतर नहीं है।

+0

महत्वपूर्ण अवलोकन! – jfm3

+1

यह एक अच्छा जवाब है। इससे मुझे यह भी समझ में आया कि क्यों 'char a [2] = "be" 'बुद्धिमान नहीं होगा। – Pithikos

+0

तत्वों को malloc के माध्यम से एक स्ट्रिंग में स्मृति आवंटित करते समय भी '\ 0' में प्रारंभ किया गया है? – Lokesh

1

hmmm एक सूचक के साथ प्रारंभ करने के बारे में क्या?

char *myString = "Here is a string"; 

हालांकि पारंपरिक कारणों से मैं का उपयोग करना पसंद:

unsigned char *myString = "Here is a string"; 

इस मामले में अशक्त समाप्ति संकलक द्वारा एम्बेडेड है। आप पॉइंटर को किसी अन्य स्ट्रिंग पर इंगित कर सकते हैं और आप स्वतंत्र स्ट्रिंग की किसी भी लंबाई को इंगित करते हैं।

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