स्मृति आवंटन के संदर्भ में इन दोनों के बीच क्या अंतर है।मेमोरी आवंटन char * और char []
char *p1 = "hello";
char p2[] = "hello";
स्मृति आवंटन के संदर्भ में इन दोनों के बीच क्या अंतर है।मेमोरी आवंटन char * और char []
char *p1 = "hello";
char p2[] = "hello";
पहले एक एक सूचक चर (भंडारण के चार या आठ बाइट्स मंच के आधार पर) बनाता है और एक स्ट्रिंग वहाँ शाब्दिक की एक स्थान संग्रहीत करता है, दूसरा एक एक सरणी बनाता छह पात्रों में से (सहित शून्य स्ट्रिंग टर्मिनेटर बाइट) और वहां शाब्दिक प्रतिलिपि बनाता है।
आपको पहली पंक्ति पर एक कंपाइलर चेतावनी मिलनी चाहिए क्योंकि शाब्दिक const
है।
स्ट्रिंग अक्षरशः कहाँ संग्रहित है? क्या यह ढेर में है? – blitzkriegz
स्ट्रिंग अक्षर सामान्य रूप से दोनों स्टैक और ('new' /' delete' प्रबंधित) ढेर से अलग स्मृति के क्षेत्र में संग्रहीत किया जाता है। आपके प्लेटफ़ॉर्म के आधार पर, यह क्षेत्र कॉपी-संरक्षित हो सकता है, इसलिए इसे लिखने से प्रोग्राम को क्रैश हो जाएगा। –
क्रिस्टल स्पष्ट उत्तर के लिए बहुत बहुत धन्यवाद। – blitzkriegz
पहला वाला कॉन्स (केवल पढ़ने के लिए) डेटा के लिए एक गैर-कॉन्स्ट पॉइंटर है, दूसरा एक गैर-कॉन्स सरणी है।
तो char * p1 = "हैलो" char const * p1 = "हैलो" के बराबर है? – blitzkriegz
@ महात्मा: हाँ, और यह भी अधिक पठनीय और सहज संस्करण के समान है: 'const char * p1 =" हैलो "'। –
@ महात्मा: हाँ, लेकिन पहला खतरनाक है: बिना किसी 'कॉन्स' योग्यता के, स्ट्रिंग शाब्दिक को संशोधित करने के प्रयास के बिना कोई कंपाइलर सुरक्षा नहीं है, अपरिभाषित व्यवहार प्रदान करता है। –
के बाद से पहले एक स्थिरांक के लिए एक गैर स्थिरांक सूचक है (केवल पढ़ने के लिए) डेटा, दूसरा एक गैर स्थिरांक सरणी है, के रूप में पॉल ने कहा, आप लिख सकते हैं:
p2[2]='A'; //changing third character - okay
लेकिन आप नहीं कर सकते लिखें:
p1[2]='A';//changing third character - runtime error!
पहला 'कॉन्स्ट चार * होना चाहिए! – rubenvb
'पी 1' 4 या 8 बाइट्स (मेमोरी एड्रेस स्टोर करने के लिए आवश्यक) लेता है जो मंच निर्भर है। 'पी 2 '6 बाइट्स लेता है (= 5 बाइट स्ट्रिंग' हैलो' + 1 बाइट नल टर्मिनिंग कैरेक्टर के लिए)। – RBT