जब आप अपने स्रोत कोड में एक "स्ट्रिंग" लिखते हैं, तो यह सीधे निष्पादन योग्य में लिखा जाता है क्योंकि उस मूल्य को संकलन समय पर जानने की आवश्यकता होती है (सॉफ्टवेयर को अलग-अलग खींचने और उनमें सभी सादे पाठ स्ट्रिंग खोजने के लिए उपकरण उपलब्ध हैं)। जब आप लिखते हैं char *a = "This is a string", "यह एक स्ट्रिंग है" का स्थान निष्पादन योग्य में है, और स्थान aइंगित करता है, निष्पादन योग्य में है। निष्पादन योग्य छवि में डेटा केवल-पढ़ने के लिए है।
आपको क्या करने की आवश्यकता है (जैसा कि अन्य उत्तरों ने बताया है) उस मेमोरी को उस स्थान पर बनाएं जो केवल पढ़ने के लिए नहीं है - ढेर पर, या स्टैक फ्रेम में। यदि आप एक स्थानीय सरणी घोषित करते हैं, तो उस सरणी के प्रत्येक तत्व के लिए स्टैक पर जगह बनाई जाती है, और स्ट्रिंग में उस स्थान पर स्ट्रिंग शाब्दिक (जो निष्पादन में संग्रहीत होता है) की नकल की जाती है।
char a[] = "This is a string";
आप उस डेटा को मैन्युअल रूप से ढेर पर कुछ मेमोरी आवंटित करके कॉपी कर सकते हैं, और फिर strcpy()उस स्पेस में एक स्ट्रिंग शाब्दिक कॉपी करने के लिए उपयोग कर सकते हैं।
char *a = malloc(256);
strcpy(a, "This is a string");
जब भी आप इसके साथ समाप्त होने malloc()पर कॉल करने के लिए याद रखना का उपयोग करके स्थान आवंटित free()करते हैं (पढ़ें: मेमोरी लीक)।
मूल रूप से, आपको यह ट्रैक रखना होगा कि आपका डेटा कहां है। जब भी आप अपने स्रोत में एक स्ट्रिंग लिखते हैं, तो उस स्ट्रिंग को केवल पढ़ा जाता है (अन्यथा आप संभावित रूप से निष्पादन योग्य के व्यवहार को बदल देंगे - कल्पना करें कि आपने लिखा था char *a = "hello";और फिर बदल a[0]गया 'c'। फिर कहीं और लिखा गया printf("hello");। यदि आपको पहले बदलने की अनुमति दी गई थी। चरित्र "hello", और आपके संकलक ने इसे केवल एक बार संग्रहीत किया (यह चाहिए), फिर printf("hello");आउटपुट होगा cello! "