मूल रूप से, हां, यह इस अर्थ में सुरक्षित है कि मूल्य अनिश्चित काल तक चलेगा क्योंकि यह स्थैतिक है।
यह इस अर्थ में सुरक्षित नहीं है कि आपने निरंतर डेटा के लिए परिवर्तनीय सूचक के बजाय चर डेटा को निरंतर सूचकांक वापस कर दिया है। यदि बुला कार्यों डेटा को संशोधित करने की अनुमति नहीं है यह बेहतर है:
const char *GetString(void)
{
static char sTest[5];
strncpy(sTest, "Test", sizeof(sTest)-1);
sTest[sizeof(sTest)-1] = '\0';
return sTest;
}
सरल मामले में दिखाया गया है, यह शायद ही बफर अतिप्रवाह के बारे में चिंता करने के लिए आवश्यक है, हालांकि कोड के अपने संस्करण में चिंता है, और अशक्त सुनिश्चित करता है समाप्ति। एक वैकल्पिक TR24731 समारोह strcpy_s
बजाय का उपयोग करने के होगा:
const char *GetString(void)
{
static char sTest[5];
strcpy_s(sTest, sizeof(sTest), "Test");
return sTest;
}
इससे भी महत्वपूर्ण बात, दोनों वेरिएंट निरंतर डेटा के लिए एक (चर) सूचक लौटने के लिए, तो उपयोगकर्ता स्ट्रिंग को संशोधित नहीं जाना चाहिए और (शायद) के बाहर कुचल रही सरणी की सीमा। (जैसा कि @strager टिप्पणियों में इंगित करता है, const char *
लौटने की गारंटी नहीं है कि उपयोगकर्ता लौटाए गए डेटा को संशोधित करने का प्रयास नहीं करेगा। हालांकि, उन्हें लौटा हुआ पॉइंटर डालना होगा, इसलिए यह गैर-कॉन्स है और फिर डेटा को संशोधित करें ; यह अपरिभाषित व्यवहार का आह्वान करता है और उस बिंदु पर कुछ भी संभव है।)
शाब्दिक वापसी का एक लाभ यह है कि नो-राइट वादा आमतौर पर संकलक और ऑपरेटिंग सिस्टम द्वारा लागू किया जा सकता है। स्ट्रिंग को प्रोग्राम के टेक्स्ट (कोड) सेगमेंट में रखा जाएगा, और ऑपरेटिंग सिस्टम एक गलती उत्पन्न करेगा (यूनिक्स पर सेगमेंटेशन उल्लंघन) यदि उपयोगकर्ता रिटर्न वैल्यू द्वारा इंगित डेटा को संशोधित करने का प्रयास करता है।
[कम से कम अन्य उत्तरों में से एक नोट करता है कि कोड पुन: प्रवेश नहीं किया गया है; वह सही है। शाब्दिक लौटने वाला संस्करण पुनः प्रवेशकर्ता है। तो फिर से entrancy महत्वपूर्ण है, इंटरफ़ेस ताकि फोन करने वाले जहां डाटा संग्रहित किया जाता है स्थान प्रदान करता है ठीक किया जाना आवश्यक]
स्रोत
2009-01-17 18:07:38
भी मजबूत हो सकता है "सामान्य तौर पर वे बचा जाना चाहिए", लेकिन यह निश्चित है कि आपको जोखिम और सीमाओं से अवगत होना चाहिए। _why_ पर स्पष्टता के लिए +1 ठीक है। – dmckee
मैं डीएमकी के साथ सहमत हूं, पुन: प्रवेश समस्याएं फ़ंक्शन कॉल में जीवित रहने वाली स्थिरताओं के डिजाइन की वजह से हैं। यह बुरा व्यवहार नहीं है। लेकिन आपको वास्तव में जोखिम से अवगत होना चाहिए। –