हां, एक स्थानीय चर का जीवनकाल उस दायरे ( {
, }
) के भीतर होता है , जिसमें यह बनाया गया है।
स्थानीय चर में स्वचालित या स्थानीय भंडारण होता है। स्वचालित क्योंकि वे स्वचालित रूप से नष्ट हो जाते हैं एक बार गुंजाइश जिसके भीतर उन्हें बनाया जाता है समाप्त होता है।
हालांकि, आपके पास यहां क्या है एक स्ट्रिंग शाब्दिक है, जिसे एक कार्यान्वयन परिभाषित रीड-ओनली मेमोरी में आवंटित किया गया है। स्ट्रिंग शाब्दिक स्थानीय चर से भिन्न होते हैं और वे जीवन भर कार्यक्रम में जीवित रहते हैं। उनके पास स्थिर अवधि [Ref 1] जीवनकाल है।
चेतावनी!
हालांकि, ध्यान दें कि एक स्ट्रिंग शाब्दिक की सामग्री को संशोधित करने का कोई भी प्रयास एक अपरिभाषित व्यवहार (यूबी) है। उपयोगकर्ता कार्यक्रमों को एक स्ट्रिंग शाब्दिक की सामग्री को संशोधित करने की अनुमति नहीं है।
इसलिए, इसे हमेशा const
स्ट्रिंग शाब्दिक घोषित करते समय उपयोग करने के लिए प्रोत्साहित किया जाता है ।
const char*p = "string";
के बजाय,
char*p = "string";
वास्तव में, C ++ में यह बिना स्ट्रिंग स्ट्रिंग को शाब्दिक घोषित करने के लिए दर्शाया const
गया है। हालांकि, एक स्ट्रिंग शाब्दिक की घोषणा करने से const
आपको एक फायदा मिलता है कि कंपाइलर आमतौर पर आपको एक चेतावनी देगा यदि आप स्ट्रिंग स्ट्रिंग को संशोधित करने का प्रयास करते हैं। दूसरा मामला।
नमूना कार्यक्रम :
#include<string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[]="Sample string";
strcpy(str1,source);
strcpy(str2,source);
return 0;
}
आउटपुट:
cc1: चेतावनियों को त्रुटियों के रूप में व्यवहार किया जा रहा है
prog.c: फ़ंक्शन में 'main':
prog.c: 9: error: 'strcpy' के तर्क 1 को पॉइंटर टार्गेट से क्वालीफायर से हटाता है
सूचना संकलक दूसरे मामले के लिए चेतावनी देता है, लेकिन पहले के लिए नहीं।
यहां कुछ उपयोगकर्ताओं द्वारा पूछे जा रहे प्रश्न का उत्तर देने के लिए:
अभिन्न शाब्दिकों के साथ क्या व्यवहार है?
दूसरे शब्दों में, निम्नलिखित कोड मान्य है?
int *foo()
{
return &(2);
}
जवाब है, यह कोड मान्य नहीं है। यह बीमार है और संकलक त्रुटि देगा।
कुछ इस तरह:
prog.c:3: error: lvalue required as unary ‘&’ operand
स्ट्रिंग शाब्दिक एल-मान हैं, अर्थात: आप एक स्ट्रिंग शाब्दिक का पता ले सकते हैं, लेकिन इसकी सामग्री को बदल नहीं सकते हैं।
हालांकि, कोई भी अन्य शाब्दिक ( int
और float
, char
आदि) आर-मान हैं (सी मानक इन के लिए एक अभिव्यक्ति के मूल्य शब्द का उपयोग करता है ) और उनका पता बिल्कुल नहीं लिया जा सकता है।
[Ref 1] C99 मानक 6.4.5 / 5 "स्ट्रिंग लिटरल्स - शब्दार्थ":
अनुवाद चरण 7 में, एक बाइट या मान शून्य का कोड प्रत्येक मल्टीबीट चरित्र अनुक्रम से जुड़ा होता है जो एक स्ट्रिंग शाब्दिक या शाब्दिक परिणाम होता है। मल्टीबाइट कैरेक्टर सीक्वेंस का उपयोग तब स्टैटिक स्टोरेज की अवधि और लंबाई को शुरू करने के लिए किया जाता है । चरित्र स्ट्रिंग शाब्दिकों के लिए, सरणी तत्वों में चार वर्ण होते हैं, और मल्टीबाइट चरित्र अनुक्रम के अलग-अलग बाइट्स के साथ आरंभिक होते हैं; विस्तृत स्ट्रिंग शाब्दिकों के लिए, सरणी तत्वों में wchar_t टाइप होता है, और उन्हें विस्तृत वर्णों के अनुक्रम के साथ आरंभ किया जाता है ...
यह अनिर्दिष्ट है कि क्या ये सरणियाँ विशिष्ट हैं बशर्ते कि उनके तत्वों में उचित मूल्य हों। यदि प्रोग्राम ऐसे सरणी को संशोधित करने का प्रयास करता है, तो व्यवहार अपरिभाषित है ।
int rc
। इसका जीवनकाल प्रत्येक में से एक पर समाप्त होता हैreturn
। जिन बिंदुओं पर आप लौट रहे हैं वे स्ट्रिंग शाब्दिक हैं। स्ट्रिंग के शाब्दिक में स्थिर भंडारण अवधि होती है: उनका जीवनकाल कम से कम कार्यक्रम के अनुसार होता है।