समस्या यह है कि आप स्ट्रिंग अक्षर को संशोधित करने का प्रयास कर रहे हैं। ऐसा करने से आपके प्रोग्राम के व्यवहार को अपरिभाषित किया जा सकता है।
यह कहकर कि आपको स्ट्रिंग अक्षर को संशोधित करने की अनुमति नहीं है, एक ओवरम्प्लिफिकेशन है। यह कहकर कि स्ट्रिंग अक्षर const
गलत है; वे नहीं हैं।
चेतावनी: डिग्रेशन निम्नानुसार है।
स्ट्रिंग शाब्दिक "this is a test"
टाइप char[15]
(लंबाई के लिए 14, '\0'
को समाप्त करने के लिए प्लस 1) की अभिव्यक्ति है।अधिकांश संदर्भों में, इस सहित, ऐसी अभिव्यक्ति को char*
टाइप करने के लिए, सरणी के पहले तत्व में एक सूचक में निहित रूप से परिवर्तित किया गया है।
स्ट्रिंग अक्षर द्वारा संदर्भित सरणी को संशोधित करने का प्रयास अपरिभाषित है - क्योंकि यह const
(यह नहीं है), लेकिन क्योंकि सी मानक विशेष रूप से कहता है कि यह अनिर्धारित है।
कुछ कंपाइलर आपको इससे दूर जाने की अनुमति दे सकते हैं। आपका कोड वास्तव में शाब्दिक से संबंधित स्थिर सरणी को संशोधित कर सकता है (जो बाद में बहुत भ्रम पैदा कर सकता है)।
अधिकांश आधुनिक कंपाइलर, केवल सरणी को केवल पढ़ने के लिए स्मृति में संग्रहीत करेंगे - भौतिक रोम नहीं, बल्कि स्मृति के क्षेत्र में जो वर्चुअल मेमोरी सिस्टम द्वारा संशोधन से संरक्षित है। ऐसी स्मृति को संशोधित करने का प्रयास आम तौर पर एक सेगमेंटेशन गलती और प्रोग्राम क्रैश होता है।
तो स्ट्रिंग अक्षर const
क्यों नहीं हैं? चूंकि आपको वास्तव में उन्हें संशोधित करने की कोशिश नहीं करनी चाहिए, इसलिए यह निश्चित रूप से समझ में आ जाएगा - और सी ++ स्ट्रिंग अक्षर const
बनाता है। कारण ऐतिहासिक है। const
कीवर्ड 1 9 8 9 एएनएसआई सी मानक द्वारा पेश किए जाने से पहले मौजूद नहीं था (हालांकि इससे पहले कुछ कंपेलरों द्वारा इसे लागू किया गया था)। तो एक पूर्व एएनएसआई कार्यक्रम इस प्रकार दिखाई देंगे:
#include <stdio.h>
print_string(s)
char *s;
{
printf("%s\n", s);
}
main()
{
print_string("Hello, world");
}
तथ्य यह है कि print_string
संशोधित करने के लिए स्ट्रिंग s
द्वारा की ओर इशारा अनुमति नहीं है लागू करने के लिए कोई तरीका नहीं था। एएनएसआई सी में स्ट्रिंग अक्षर const
बनाना मौजूदा कोड तोड़ दिया होगा, जिसने एएनएसआई सी समिति ने ऐसा करने से बचने के लिए बहुत मेहनत की। तब से भाषा में ऐसा बदलाव करने के लिए एक अच्छा अवसर नहीं रहा है। (सी ++ के डिजाइनर, ज्यादातर बजेर्न स्ट्राउस्ट्रप, सी के साथ पिछड़े संगतता के बारे में चिंतित नहीं थे।
दोस्त - "यह एक परीक्षा है" एक STRING लिटरल है। मतलब यह एक * केवल पढ़ने के लिए * "चार की सरणी" पढ़ें। आप कुछ प्लेटफ़ॉर्म पर क्रैश किए बिना इसे संशोधित करने का प्रयास करने से भी दूर हो सकते हैं। लेकिन यह निश्चित रूप से * किसी भी * मंच पर नो-नो है :) – paulsm4