उत्तर
के बीच अंतर के बाद से आप पहले से ही आकार घोषित है, दो घोषणाओं बिल्कुल बराबर हैं। हालांकि, अगर आप आकारों का उल्लेख नहीं है, जैसा कि आप देख सकते हैं कि पहले घोषणा एक बड़ा स्ट्रिंग बनाता है:
char a[] = "a\0";
char b[] = "a";
printf("%i %i\n", sizeof(a), sizeof(b));
प्रिंट
3 2
इसका कारण यह है दो nulls के साथ एक छोर (स्पष्ट एक और निहित एक) जबकि बी केवल निहित एक के साथ समाप्त होता है।
जब तक कि मैं गलत नहीं हूं, पहला 2 वर्णों को 0 ('0' और टर्मिनेटर जो हमेशा वहां रहता है, और बाकी को छूटेगा, और अंतिम केवल 1 char (टर्मिनेटर) प्रारंभ करेगा।
के रूप में अन्य लोगों ने बताया है, "\ 0" एक समाप्त '\ 0' चरित्र है, तो संकेत मिलता है "" वास्तव में दो अशक्त पात्रों के साथ सरणी initializes।
कुछ अन्य answerers निहित है कि यह "एक ही ", लेकिन वह बहुत सही नहीं है कोई व्यावहारिक अंतर हो सकता है -।। जब तक एक ही रास्ता सरणी एक सी स्ट्रिंग पहले अक्षर के साथ शुरुआत के रूप में यह संदर्भित करने के लिए किया जाता है प्रयोग किया जाता है लेकिन ध्यान दें कि वे वास्तव में दो का परिणाम है विभिन्न स्मृति initalizati ओएनएस, विशेष रूप से वे भिन्न होते हैं कि स्ट्र [1] निश्चित रूप से शून्य है, या संकलित, ओएस, और अन्य यादृच्छिक कारकों के आधार पर कुछ भी हो सकता है (और कुछ भी हो सकता है)। सरणी के कुछ उपयोग हैं (शायद उपयोगी नहीं, लेकिन फिर भी) जिसमें अलग-अलग व्यवहार होंगे।
प्रश्न के संदर्भ में, जहां सरणी का आकार निर्दिष्ट किया गया है, परिणाम समान हैं - अक्षर '' '' के बाद 31 नल बाइट्स, '' \ 0'' '। केवल एक unsized सरणी के संदर्भ में एक अंतर है। 'और' Str [32] = "";; 'और जोर देते हुए कर रहे हैं कि इन एक संकलक त्रुटि उत्पन्न करनी चाहिए –
कोई अंतर नहीं है। वे दोनों अविकसित प्रतीक पर एक कंपाइलर त्रुटि उत्पन्न करेंगे। : पी
मुमकिन है, आप सवाल जहां कोड था' Str [32] = "\ 0" के मूल संस्करण की बात कर रहे । यह निश्चित रूप से संदर्भ पर निर्भर करता है। यदि 'परिभाषा' के रूप में माना जाता है (जैसा कि वे प्रश्न के संशोधित संस्करण में हैं), तो प्रकार ('char') गायब था। आप 'चार मान तो * Str [33];' एक पूर्व परिभाषा के रूप में, तो दोनों सार्थक हैं (लेकिन तार अलग हैं की दिशा में रखे) - लेकिन क्या जवाब के बाकी मान से अलग। यह उत्तर सहायक नहीं है क्योंकि यह क्यों नहीं समझाता है। –
ठीक है, दो मामलों मानते हैं इस प्रकार है (संकलक त्रुटियों से बचने के):
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'};
तो, अंत में, वहाँ वास्तव में दोनों के बीच कोई अंतर नहीं है।
hmmm एक सूचक के साथ प्रारंभ करने के बारे में क्या?
char *myString = "Here is a string";
हालांकि पारंपरिक कारणों से मैं का उपयोग करना पसंद:
unsigned char *myString = "Here is a string";
इस मामले में अशक्त समाप्ति संकलक द्वारा एम्बेडेड है। आप पॉइंटर को किसी अन्य स्ट्रिंग पर इंगित कर सकते हैं और आप स्वतंत्र स्ट्रिंग की किसी भी लंबाई को इंगित करते हैं।
- 1. एकाधिक लाइन स्ट्रिंग प्रारंभ
- 2. C++ स्ट्रिंग सरणी प्रारंभ
- 3. सी स्ट्रिंग प्रारंभ में {} मामले शामिल है?
- 4. स्ट्रक्चर ऐरे प्रारंभ और स्ट्रिंग लिटल
- 5. प्रारंभ और स्ट्रिंग के अंत से बोलियां निकालें पीएचपी
- 6. जावा: स्ट्रिंग को प्रारंभ करने के लिए कैसे करें []?
- 7. सी ++ में स्ट्रिंग सेट को कैसे प्रारंभ करें?
- 8. अपस्टार्ट प्रारंभ करें। पुन: प्रारंभ करें ubuntu
- 9. Jquery मोबाइल सूचीदृश्य - प्रारंभ प्रारंभ जांच
- 10. संग्रह प्रारंभ
- 11. अजगर प्रारंभ
- 12. प्रारंभ enum
- 13. प्रारंभ stackalloc
- 14. NSArrayController प्रारंभ
- 15. System.Web.Mvc.Controller प्रारंभ
- 16. MediaRecorder प्रारंभ
- 17. प्रारंभ NSDate
- 18. SSLContext प्रारंभ
- 19. प्रारंभ रूबी
- 20. कस्टम सदस्यताप्रदाता विधि प्रारंभ करें
- 21. स्ट्रिंग
- 22. करता है सी # संग्रह प्रारंभ सिंटेक्स बचें डिफ़ॉल्ट प्रारंभ ओवरहेड
- 23. प्रारंभ-आधारित फ़ंक्शन को प्रारंभ करना (ब्रेक के समान?)
- 24. org.apache.catalina.core.StandardContext प्रारंभ आंतरिक चेतावनी: त्रुटि श्रोता प्रारंभ करें
- 25. .cu (CUDA) फ़ाइलों के लिए प्रारंभ C++ वाक्यविन्यास प्रारंभ करें
- 26. पाश लापता प्रारंभ
- 27. एसटीडी का प्रारंभ :: सरणी
- 28. DotNetOpenAuth: वेबफ़ॉर्म, प्रारंभ करना
- 29. सूची प्रारंभ संकलन त्रुटि
- 30. सरणी प्रारंभ जब नए
सरणी का पिछला बाइट शून्य बाइट भी होगा। –