C में स्ट्रिंग्स को दो तरीकों से घोषित किया जा सकता है: char s[] (ऐरे) और char *s (पॉइंटर)। इनमें महत्वपूर्ण अंतर हैं।
मुख्य अंतर
| विशेषता | char s[] (ऐरे) | char *s (पॉइंटर) |
|---|---|---|
| स्टोरेज | स्टैक पर पूरा स्ट्रिंग | स्टैक पर पॉइंटर, स्ट्रिंग रीड-ओनली मेमोरी (कोड सेक्शन) में |
| sizeof | स्ट्रिंग लंबाई + 1 (नल टर्मिनेटर) | पॉइंटर का आकार (4 या 8 बाइट्स) |
| संशोधन | अनुमत | अनुमत नहीं (अनडिफाइंड बिहेवियर/सेगफॉल्ट) |
| पुनः असाइनमेंट | नहीं | हाँ |
उदाहरण 1: ऐरे (संशोधन योग्य)
#include <stdio.h>
int main() {
char s[] = "Hello World";
s[6] = 'x'; // स्थिति 6 पर 'W' को 'x' में बदलें
printf("%s\n", s); // Hello xorld
return 0;
}
आउटपुट
Hello xorld
उदाहरण 2: पॉइंटर (रीड-ओनली)
#include <stdio.h>
int main() {
char *s = "Hello World";
s[6] = 'x'; // सेगमेंटेशन फॉल्ट!
printf("%s\n", s);
return 0;
}
आउटपुट
Segmentation Fault
व्याख्या
char s[]: कंपाइलर स्टैक पर ऐरे के लिए जगह अलोकेट करता है और स्ट्रिंग लिटरल की कॉपी करता है।char *s: पॉइंटर स्ट्रिंग लिटरल को इंगित करता है जो रीड-ओनली मेमोरी (आमतौर पर.rodataसेक्शन) में संग्रहीत होता है।- स्ट्रिंग लिटरल को संशोधित करना अनडिफाइंड बिहेवियर है।
सही उपयोग
// पॉइंटर के साथ कॉन्स्ट क्वालिफायर (सर्वोत्तम अभ्यास) const char *s = "Hello World"; // कंपाइलर चेतावनी देगा यदि संशोधन का प्रयास किया जाए