2013-02-15 60 views
5

पर कास्ट करना क्यों यह काम नहीं करता है? क्या यह काम करने के लिए कुछ रचनात्मक कास्टिंग करना संभव है?प्रारंभकर्ताओं को एक पॉइंटर

1: const char* yo1 = "abc"; 
2: const char* yo2 = { 'a', 'b', 'c', '\0' }; // <-- why can't i do this? 
3: printf("%s %s\n", yo1, yo2); 

परिणाम: विभाजन दोष

पंक्ति 2 नहीं कर रहा है मैं इसे करने की उम्मीद है।

उत्तर

5

आप कर सकते हैं:

const char* yo2 = (char [4]) { 'a', 'b', 'c', '\0' }; 

जो वैध है और प्राप्त करेंगे आप क्या चाहते हैं। ध्यान दें कि यह के बराबर नहीं है:

const char* yo2 = "abc": 

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

बाद के मामले में, "abc" एक स्ट्रिंग अक्षर है और स्थिर भंडारण अवधि (फ़ाइल स्कोप या ब्लॉक स्कोप) है।

const char yo2[] = { 'a', 'b', 'c', '\0' }; 

अपने उदाहरण के बारे में:

तुम भी एक सूचक के बजाय एक सरणी का उपयोग कर सकते हैं। सी में:

const char* yo2 = { 'a', 'b', 'c', '\0' }; 

मान्य नहीं है और अपने संकलक के रूप में यह व्याख्या:

const char* yo2 = (char *) 'a'; 

'a' का मूल्य एक सूचक मूल्य (पता) तो अपसंदर्भन yo2 अपरिभाषित व्यवहार का आह्वान नहीं है।

+0

नहीं! आरएचएस एक अस्थायी है; यह चारों ओर छड़ी की गारंटी नहीं है। – nneonneo

+0

@nneonneo यह एक यौगिक शाब्दिक है। ब्लॉक स्कोप पर घोषित होने पर इसकी स्वचालित संग्रहण अवधि होती है। अब डाउनवोट क्यों? – ouah

+0

सी में, हां। लेकिन जैसे ही आप इसे C++ में उपयोग करते हैं, या इसे C++ मोड में संकलित करते हैं, यह असुरक्षित हो जाता है। तो यह मेरी किताबों में एक सुरक्षित अभ्यास नहीं है। – nneonneo