हां, स्थानीय चर का जीवनकाल दायरे के भीतर है ({
, }
) जिसमें यह बनाया गया है।
स्थानीय चर के स्वचालित या स्थानीय भंडारण होते हैं।
स्वचालित क्योंकि वे उस स्कोप के भीतर स्वचालित रूप से नष्ट हो जाते हैं, जिसमें वे बनाए जाते हैं।
हालांकि, आपके पास यहां एक स्ट्रिंग शाब्दिक है, जिसे एक कार्यान्वयन में आवंटित किया गया है जिसे केवल स्मृति पढ़ा जाता है। स्ट्रिंग अक्षर स्थानीय चर से अलग हैं और वे कार्यक्रम के पूरे जीवनकाल में जीवित रहते हैं। उनके पास स्थिर अवधि[रेफरी 1] जीवनकाल है।
सावधानी का एक शब्द!
हालांकि, ध्यान दें कि स्ट्रिंग अक्षर की सामग्री को संशोधित करने का कोई भी प्रयास एक अनिर्धारित व्यवहार है। उपयोगकर्ता प्रोग्रामों को एक स्ट्रिंग अक्षर की सामग्री को संशोधित करने की अनुमति नहीं है।
इसलिए, स्ट्रिंग शाब्दिक घोषित करते समय इसे const
का उपयोग करने के लिए हमेशा प्रोत्साहित किया जाता है।
const char*p = "string";
बजाय
,
char*p = "string";
वास्तव में, C++ यह एक स्ट्रिंग const
बिना शाब्दिक हालांकि ग में नहीं घोषित करने के लिए मान्य नहीं है। हालांकि, const
के साथ एक स्ट्रिंग शाब्दिक घोषित करने से आपको लाभ मिलता है कि यदि आप दूसरे मामले में स्ट्रिंग अक्षर को संशोधित करने का प्रयास करते हैं तो आमतौर पर संकलक आपको चेतावनी देंगे।
Sample program:
#include<string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[]="Sample string";
strcpy(str1,source); //No warning or error just Uundefined Behavior
strcpy(str2,source); //Compiler issues a warning
return 0;
}
आउटपुट:
cc1: warnings being treated as errors
prog.c: In function ‘main’:
prog.c:9: error: passing argument 1 of ‘strcpy’ discards qualifiers from pointer target type
सूचना संकलक दूसरे मामले के लिए चेतावनी दी है, लेकिन पहले के लिए नहीं।
संपादित करें:
अभिन्न शाब्दिक के साथ सौदा क्या है: क्यू उत्तर देने के लिए उपयोगकर्ताओं के एक जोड़े यहां से कहा जा रहा है?
दूसरे शब्दों में इस कोड को मान्य है:
int *foo()
{
return &(2);
}
जवाब है, नहीं यह कोड मान्य नहीं है, यह बीमार बनाई है है & एक संकलक त्रुटि दे देंगे।
कुछ की तरह:
prog.c:3: error: lvalue required as unary ‘&’ operand
स्ट्रिंग शाब्दिक एल-मूल्यों, यानी हैं: आप एक स्ट्रिंग शाब्दिक का पता ले जा सकते हैं, लेकिन यह सामग्री है नहीं बदल सकते।
हालांकि, किसी भी अन्य शाब्दिक (int
, float
, char
आदि) आर-मान (ग मानक अवधि इन के लिए एक अभिव्यक्ति का मूल्य उपयोग करता है) & उनका पता ही नहीं लिया जा सकता है।
[रेफरी 1]C99 मानक 6.4.5/5 "स्ट्रिंग literals - शब्दार्थ":
आपके फ़ंक्शन में केवल "var" पैरामीटर 'int rc' है। इसका जीवनकाल 'रिटर्न' में से प्रत्येक पर समाप्त होता है। जिन पॉइंटर्स आप लौट रहे हैं वे स्ट्रिंग स्ट्रिंग हैं। स्ट्रिंग अक्षर में स्थिर भंडारण अवधि होती है: उनका जीवनकाल कम से कम कार्यक्रम के जितना होता है। – Kaz
क्या होगा यदि यह स्ट्रिंग शब्दशः लेकिन अन्य प्रकार के शाब्दिक नहीं है, जैसे: int * foo() {वापसी &(2); // या // int n = 2; // वापसी और एन; } –
मेरे उत्तर में संपादित करें जो आपकी क्वेरी को संबोधित करता है। ध्यान दें, आपको इसे एक टिप्पणी के रूप में पोस्ट करना चाहिए था और जवाब नहीं देना चाहिए। प्रश्नों, संदेह आदि को टिप्पणियों में पोस्ट किया जाना चाहिए, केवल उत्तरों को उत्तर के तहत पोस्ट किया जाना चाहिए। –