2012-10-01 14 views
17

में अस्थायी वस्तुओं का आजीवन ऑब्जेक्ट्स मैं a note को समझने की कोशिश कर रहा हूं जिससे सी 99 और सी 11 के बीच बदलाव आया। , 8 अर्थात्:: परिवर्तन यह है कि नोट में प्रस्तावित में सी 11 के 6.2.4 समाप्त हो गयासी 11 बनाम सी 99

(सहित संरचना या संघ प्रकार, जहां संरचना या संघ सरणी प्रकार के साथ एक सदस्य शामिल है के साथ एक गैर lvalue अभिव्यक्ति , पुनरावर्ती रूप से, सभी निहित संरचनाओं और संघों के सदस्य) को स्वचालित संग्रहण अवधि और अस्थायी जीवनकाल वाले ऑब्जेक्ट में संदर्भित करता है। इसका जीवनकाल तब शुरू होता है जब अभिव्यक्ति का मूल्यांकन किया जाता है और इसकी प्रारंभिक मान अभिव्यक्ति का मान है। इसका जीवनकाल समाप्त होता है जब युक्त पूर्ण अभिव्यक्ति या पूर्ण घोषणाकर्ता का मूल्यांकन समाप्त होता है। अवांछित व्यवहार में अस्थायी जीवनकाल परिणामों वाले किसी ऑब्जेक्ट को संशोधित करने का कोई भी प्रयास।

मुझे समझ में क्यों परिवर्तन की जरूरत थी (कुछ चर्चा पाया जा सकता है here। ध्यान दें कि चर्चा C11 से पहले वापस चला जाता है)। हालांकि, मुझे समझ नहीं आता एक पक्ष टिप्पणी है कि क्लार्क नेल्सन ने अपनी टिप्पणी में लिखित रूप में किया जाता है:

कृपया ध्यान दें कि इस दृष्टिकोण अतिरिक्त इस, जो C99 के तहत अनुरूप किया गया था की तरह एक उदाहरण वाणी, गैर होने के लिए अनुसार होता है:

struct X { int a[5]; } f(); 
int *p = f().a; 
printf("%p\n", p); 

मुझे समझ में क्यों इस उदाहरण C11 के तहत गैर-अनुरूप है। जो मैं विशेष रूप से समझने में विफल रहता हूं वह यह है कि यह सी 99 के तहत कैसे अनुरूप है। और, यदि इसे सी 99 के तहत परिभाषित किया गया है, तो यह क्या करना चाहिए, परिभाषित रूप से एक लटकते सूचक के मूल्य को मुद्रित करें?

+0

मैं यह समझने में असफल रहा कि यह सी 99 या सी 11 के तहत गैर-अनुरूप नहीं है, क्योंकि यह अस्थायी जीवनकाल के साथ ऑब्जेक्ट को संशोधित करने का प्रयास नहीं करता है, या जीवनकाल समाप्त होने के बाद इसे एक्सेस नहीं करता है। सूचक मुद्रित सूचक का सटीक मान स्पष्ट रूप से अज्ञात है, लेकिन इसे कुछ सूचक मूल्य मुद्रित करना चाहिए। –

+1

@ChrisDodd C11 में इसे अपरिभाषित करने का कारण यह है कि यह 6.2.4: 2 का उल्लंघन करता है, विशेष रूप से "पॉइंटर का मान अनिश्चित हो जाता है जब ऑब्जेक्ट यह इंगित करता है (या सिर्फ अतीत) अपने जीवनकाल के अंत तक पहुंच जाता है।" अनिश्चित सामग्री तक पहुंचने के लिए यह नैतिक रूप से अपरिभाषित व्यवहार है (इसे जे 2 में सूचीबद्ध किया गया है: "किसी ऑब्जेक्ट के पॉइंटर का मूल्य जिसका जीवनकाल समाप्त हो गया है (6.2.4)", हालांकि वास्तविक मानक निकाय थोड़ा सा है अधिक संदिग्ध)। सी 99 उस सम्मान में बहुत समान है। मुझे लगता है कि केवल अंतर यह है कि पी ** ** अनिश्चित नहीं बनता है क्योंकि यह कभी तय नहीं होता है। –

उत्तर

7

मेरी समझ यह है कि सी 99 में, किसी वस्तु के लिए जीवन भर का बेहतरीन अनाज ब्लॉक है। इस प्रकार, जबकि 6.5.2.2 (और आपके द्वारा संदर्भित नोट में उल्लिखित कुछ अन्य §) विशेष रूप से कहते हैं कि आप अगले अनुक्रम बिंदु के बाद लौटाए गए मूल्य तक नहीं पहुंच सकते हैं, तकनीकी रूप से इसका पता अनिश्चित होने तक आपके द्वारा छोड़ा गया है अवरुद्ध ब्लॉक (कारण है कि आपके पास एक पहुंच योग्य वस्तु के लिए आरक्षित कुछ भंडारण होना चाहिए, हालांकि पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है)। इस प्रकार,

struct X { int a[5]; } f(); 
int *p; 
{ p = f().a; } 
printf("%p\n", p); 

सी 99 के साथ-साथ सी 11 में अपरिभाषित है। सी 11 में, "अस्थायी जीवनकाल" की धारणा, जो सी 99 में मौजूद नहीं है, यह मानने की अनुमति देती है कि जैसे ही पूर्ण अभिव्यक्ति समाप्त होती है, सूचक सूचक अनिश्चित हो जाता है।

+0

"ऑब्जेक्ट के लिए आजीवन जीवन का बेहतरीन अनाज ब्लॉक है" स्वचालित भंडारण अवधि वाले वस्तुओं के लिए सहमत (सी 99 6.2.4: 5) –