2011-01-13 18 views
31

स्मृति आवंटन के संदर्भ में इन दोनों के बीच क्या अंतर है।मेमोरी आवंटन char * और char []

char *p1 = "hello"; 
char p2[] = "hello"; 
+13

पहला 'कॉन्स्ट चार * होना चाहिए! – rubenvb

+0

'पी 1' 4 या 8 बाइट्स (मेमोरी एड्रेस स्टोर करने के लिए आवश्यक) लेता है जो मंच निर्भर है। 'पी 2 '6 बाइट्स लेता है (= 5 बाइट स्ट्रिंग' हैलो' + 1 बाइट नल टर्मिनिंग कैरेक्टर के लिए)। – RBT

उत्तर

35

पहले एक एक सूचक चर (भंडारण के चार या आठ बाइट्स मंच के आधार पर) बनाता है और एक स्ट्रिंग वहाँ शाब्दिक की एक स्थान संग्रहीत करता है, दूसरा एक एक सरणी बनाता छह पात्रों में से (सहित शून्य स्ट्रिंग टर्मिनेटर बाइट) और वहां शाब्दिक प्रतिलिपि बनाता है।

आपको पहली पंक्ति पर एक कंपाइलर चेतावनी मिलनी चाहिए क्योंकि शाब्दिक const है।

+0

स्ट्रिंग अक्षरशः कहाँ संग्रहित है? क्या यह ढेर में है? – blitzkriegz

+10

स्ट्रिंग अक्षर सामान्य रूप से दोनों स्टैक और ('new' /' delete' प्रबंधित) ढेर से अलग स्मृति के क्षेत्र में संग्रहीत किया जाता है। आपके प्लेटफ़ॉर्म के आधार पर, यह क्षेत्र कॉपी-संरक्षित हो सकता है, इसलिए इसे लिखने से प्रोग्राम को क्रैश हो जाएगा। –

+0

क्रिस्टल स्पष्ट उत्तर के लिए बहुत बहुत धन्यवाद। – blitzkriegz

8

पहला वाला कॉन्स (केवल पढ़ने के लिए) डेटा के लिए एक गैर-कॉन्स्ट पॉइंटर है, दूसरा एक गैर-कॉन्स सरणी है।

+0

तो char * p1 = "हैलो" char const * p1 = "हैलो" के बराबर है? – blitzkriegz

+3

@ महात्मा: हाँ, और यह भी अधिक पठनीय और सहज संस्करण के समान है: 'const char * p1 =" हैलो "'। –

+2

@ महात्मा: हाँ, लेकिन पहला खतरनाक है: बिना किसी 'कॉन्स' योग्यता के, स्ट्रिंग शाब्दिक को संशोधित करने के प्रयास के बिना कोई कंपाइलर सुरक्षा नहीं है, अपरिभाषित व्यवहार प्रदान करता है। –

6

के बाद से पहले एक स्थिरांक के लिए एक गैर स्थिरांक सूचक है (केवल पढ़ने के लिए) डेटा, दूसरा एक गैर स्थिरांक सरणी है, के रूप में पॉल ने कहा, आप लिख सकते हैं:

p2[2]='A'; //changing third character - okay 

लेकिन आप नहीं कर सकते लिखें:

p1[2]='A';//changing third character - runtime error! 
+1

दूसरा मामला वास्तव में एक संकलन त्रुटि से भी बदतर है; संकलक अनिवार्य रनटाइम व्यवहार देकर इसे स्वीकार करेगा। –

+1

यह सच नहीं है- उसे संकलन त्रुटि नहीं मिलेगी क्योंकि स्ट्रिंग अक्षर का आधार नहीं है। हालांकि उन्हें यूबी मिलेगा। – Puppy

+0

@DeadMG: निश्चित। :-) – Nawaz

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