सी ++ स्ट्रिंग शाब्दिक हैं स्थिरांकchar
, आप कानूनी तौर पर उन्हें संशोधित नहीं कर सकते हैं जिसका मतलब है की सरणियों:
यहाँ मेरी कोड है।
आप सुरक्षित रूप से एक सूचक के लिए एक स्ट्रिंग शाब्दिक (जो एक अंतर्निहित सरणी-टू-सूचक रूपांतरण शामिल है) प्रदान करना चाहते हैं, तो आप न सिर्फ char*
के रूप में, const char*
के रूप में लक्ष्य सूचक की घोषणा करने की जरूरत है। (
#include <iostream>
int main() {
char *ptr = "some literal"; // This is invalid
*ptr = 'S';
std::cout << ptr << "\n";
}
एक गैर const
:
#include <iostream>
using namespace std;
struct WORDBLOCK
{
const char* string1;
const char* string2;
};
void f3()
{
WORDBLOCK word;
word.string1 = "Test1";
word.string2 = "Test2";
const char *test1 = word.string1;
const char *test2 = word.string2;
const char** teststrings;
teststrings = &test1;
*teststrings = test2;
cout << "The first string is: "
<< teststrings
<< " and your second string is: "
<< *teststrings
<< endl;
}
पर विचार करता है, तो भाषा नहीं था इस प्रतिबंध को लागू क्या हो सकता है:
अपने कोड का एक संस्करण है कि चेतावनी के बिना संकलित है) char*
आपको उस डेटा को संशोधित करने देता है जो सूचक इंगित करता है। यदि आप एक स्ट्रिंग शाब्दिक (स्ट्रिंग के पहले अक्षर में एक सूचक को पूरी तरह से परिवर्तित कर सकते हैं) को सादे char*
पर असाइन कर सकते हैं, तो आप कंपाइलर से कोई चेतावनी के साथ स्ट्रिंग शाब्दिक को संशोधित करने के लिए उस पॉइंटर का उपयोग करने में सक्षम होंगे। अमान्य कोड से ऊपर, अगर यह काम किया,
Some literal
प्रिंट होगा - और यह वास्तव में कुछ सिस्टम पर ऐसा हो सकता है। हालांकि, मेरे सिस्टम पर, यह सेगमेंटेशन गलती के साथ मर जाता है क्योंकि यह केवल पढ़ने योग्य स्मृति (भौतिक रोम नहीं, बल्कि स्मृति को ऑपरेटिंग सिस्टम द्वारा केवल पढ़ने के रूप में चिह्नित किया गया है) को लिखने का प्रयास करता है।
(एक तरफ: स्ट्रिंग शाब्दिक के लिए सी के नियमों सी ++ के नियमों से अलग हैं सी में एक स्ट्रिंग शाब्दिक char
की एक सरणी है, नहींconst char
की एक सरणी - लेकिन संशोधित करने के लिए यह व्यवहार अपरिभाषित है प्रयास करने से यह।। इसका मतलब है कि सी में आप कानूनी रूप से char *s = "hello"; s[0] = 'H';
लिख सकते हैं, और संकलक आवश्यक रूप से शिकायत नहीं करेगा - लेकिन जब आप इसे चलाते हैं तो प्रोग्राम सेगमेंटेशन गलती के साथ मरने की संभावना है। यह const
से पहले सी कोड के साथ पिछड़े संगतता को बनाए रखने के लिए किया गया था। कीवर्ड पेश किया गया था। सी ++ शुरू से ही const
थी, इसलिए इस विशेष समझौता आवश्यक नहीं था।)
स्रोत
2012-12-03 20:02:51
मैं अपने कोड थोड़ा, reforma संपादित कर लिया है आउटपुट स्टेटमेंट को टिंग करना ताकि इसे स्क्रॉल किए बिना पढ़ा जा सके और शीर्ष पर कुछ आवश्यक लाइनें जोड़ सकें। –
(http://stackoverflow.com/questions/9650058/deprecated-conversion-from-string-literal-to-char) –