2011-10-20 5 views
10

यह मेरे पास question की निरंतरता है।स्ट्रिंग सरणी प्रारंभिकरण

निम्नलिखित कोड पर विचार करें:

char *hi = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

यह मेरे आश्चर्य संकलन नहीं है (जाहिरा तौर पर मैं और साथ ही मैंने सोचा था कि सी वाक्य रचना पता नहीं है) और निम्न त्रुटि उत्पन्न करता है:

error: initializer element is not constant 

अगर मैं चार में चार * बदल [] यह ठीक संकलित:

char hi[] = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

किसी ने मुझसे क्यों करने के लिए व्याख्या कर सकते हैं?

उत्तर

6

पहले उदाहरण (char *hi = "hello";) में, आप एक गैर-कॉन्स्ट पॉइंटर बना रहे हैं जिसे स्थिर स्थिर स्ट्रिंग "हैलो" को इंगित करने के लिए प्रारंभ किया गया है। यह सूचक, सिद्धांत रूप में, आपको पसंद की किसी भी चीज़ पर इंगित कर सकता है।

दूसरे उदाहरण में (char hi[] = "hello";) आप विशेष रूप से एक संकेतक परिभाषित कर रहे हैं, सूचक नहीं, इसलिए पता संदर्भ यह संशोधित है। ध्यान दें कि एक सरणी को स्मृति के विशिष्ट ब्लॉक में एक गैर-संशोधित सूचक के रूप में सोचा जा सकता है।

आपका पहला उदाहरण वास्तव में सी ++ (मेरे संकलक, कम से कम) में बिना किसी समस्या के संकलित करता है।

+1

धन्यवाद। क्या कोड का पहला टुकड़ा बनाने के लिए कॉन्स्ट कीवर्ड का उपयोग करने का कोई तरीका है? – lang2

+1

@ lang2 उस दायरे में नहीं है। इसे देखें [सी अकसर किये गए सवाल] (http://c-faq.com/ansi/constasconst.html)। 'Char * const hi' के साथ भी नहीं (चार को स्थिर सूचक)। – cnicutar

+0

बस कुछ जोड़ा, 'मुझे यकीन नहीं है कि यह काम करेगा ... आपका पहला संस्करण सी ++ में ठीक है - जब मैं एक पल प्राप्त करता हूं तो मैं एक सी कंपाइलर के साथ प्रयास करूंगा :) – icabod