2013-08-05 7 views
5

स्थिति के बाद, मैं एक struct संकेत युक्त इस तरह चर पूर्णांक है। (के रूप में: NULL) कुछ ही समय बाद (पहली पास पर) अलग-अलग Var प्रारंभ हो जाएगा और संदर्भ तदनुसार अपडेट कर दिया जाएगा।क्या इसे बिना पहुंच के अनियमित स्मृति का संदर्भ देना कानूनी है?</p> <pre><code>struct Structure[] = { { &Var[0], &Var[1] }, { &Var[2], &Var[3] } }; </code></pre> <p>बात है: <code>Var</code> पहली बार इस struct भर जाता है अप्रारंभीकृत है

मैं खराबी के इस के लिए कोई कारण नहीं देखते हैं, लेकिन मैं इस पर अपनी विशेषज्ञता चाहते हैं। क्या इस तरह की सरणी में अमान्य स्मृति (सरणी सबस्क्रिप्ट के साथ) का संदर्भ रखना कानूनी है? या क्या मुझे इस स्थिति के लिए एक अलग तरह की दृष्टिकोण की आवश्यकता है?

मैं पहली बार प्रारंभ होने के बाद तक इन चरों की सामग्रियों तक नहीं कर रहा हूँ।

बहुत बहुत धन्यवाद।

संपादित करें: भविष्य के पाठकों के लाभ के लिए: Var एक वैश्विक सूचक चर है, जो शुरुआत में NULL में प्रारंभ किया गया है। प्रारंभिकरण इसे new का उपयोग कर सरणी में बदल देता है।

+1

मैं निश्चित रूप से निश्चित हूं कि उत्तर नहीं है, और कुछ अनुकूलक आपके कोड को तोड़ देंगे। – SLaks

+1

"या मुझे इस स्थिति के लिए एक अलग तरह की दृष्टिकोण की आवश्यकता है?" हम्म, शायद, चर शुरू करें? –

+0

@ DanielDaranas मैं हूँ। हालांकि केवल सरणी भरने के बाद ही भर दिया गया है। यह एक ऐसा कार्य है जिसे कई बार कहा जाता है। – ATaylor

उत्तर

7

मैं यह सोचते हैं रहा है कि Var एक सूचक वस्तु है और इसके वर्तमान मूल्य एक अशक्त सूचक है। यह आपके कथन द्वारा निहित है:

Var इस संरचना को भरने के लिए पहली बार अनियमित किया गया है। (के रूप में: NULL)

मैं भी यह सोचते हैं रहा है कि Var ब्लॉक गुंजाइश पर परिभाषित नहीं है। यदि यह ब्लॉक स्कोप पर परिभाषित किया गया है, और आपने इसे प्रारंभ नहीं किया है या इसके लिए कोई मान असाइन नहीं किया है, तो इसका मान कचरा है, जरूरी नहीं कि एक शून्य सूचक मूल्य, और उसके मान को संदर्भित करने के किसी भी प्रयास में अपरिभाषित व्यवहार है।

व्यवहार अपरिभाषित है।

तो Var == NULL, तो &Var[N] व्यवहार अपरिभाषित है।

arr[index] परिभाषा *(arr + index) के बराबर से है, इसलिए &Var[N]&(*(Var + N)) के बराबर है। पॉइंटर अंकगणितीय का व्यवहार सरणी ऑब्जेक्ट के तत्वों के संदर्भ में परिभाषित किया जाता है जिसमें पॉइंटर पॉइंट (एक ऑब्जेक्ट के साथ एक-तत्व सरणी के रूप में माना जाता है) और एक शून्य सूचक कुछ भी इंगित नहीं करता है।

एक विषयांतर:

सी स्पष्ट रूप से कहा गया है कि &*xx के रूप में मूल्यांकन किया जाता है, और &[x[i])x+i के रूप में मूल्यांकन किया जाता है; सी ++ यह नहीं कहता है, इसलिए & का संचालन मान्य होना चाहिए। सी ++ में 0 जोड़ने के लिए एक विशेष मामला है, जो एक शून्य सूचक के लिए भी अच्छी तरह से परिभाषित किया गया है (सी में ऐसा कोई विशेष मामला नहीं है)। लेकिन &Var[0] अभी भी सी और सी ++ दोनों में अमान्य है, लेकिन विभिन्न कारणों से। सी में, यह Var + 0 के समतुल्य है, लेकिन 0 को एक शून्य सूचक में जोड़ना अपरिभाषित व्यवहार है। सी ++ में, यह नहीं बराबर Var + 0 करने के लिए; बल्कि यह &(*(Var + 0)) के बराबर है; Var + 0 एक शून्य सूचक है, और इसे संदर्भित करने से यह अपरिभाषित व्यवहार है।)

खुदाई का अंत।

हां, बस एक अमान्य पते की गणना करने के लिए अपरिभाषित व्यवहार है, भले ही इसे कभी भी संदर्भित न किया जाए।

2011 आईएसओ सी ++ मानक, 5.7 [expr.add] अनुच्छेद 5 से प्रासंगिक पाठ यहां दिया गया है; ध्यान दें विशेष रूप से बहुत अंत:

जब एक अभिव्यक्ति अभिन्न प्रकार है कि करने के लिए जोड़ा या एक सूचक से घटाया जाता है, परिणाम सूचक संकार्य के प्रकार है। यदि पॉइंटर ऑपरेंड किसी सरणी ऑब्जेक्ट के तत्व को इंगित करता है, और सरणी काफी बड़ी है, तो परिणाम मूल तत्व से ऑफसेट ऑफसेट को इंगित करता है जैसे कि की सबस्क्रिप्ट का अंतर जिसके परिणामस्वरूप और मूल सरणी तत्व बराबर होते हैं अभिन्न अभिव्यक्ति। दूसरे शब्दों में, यदि अभिव्यक्ति पी सरणी ऑब्जेक्ट के i-th तत्व को इंगित करता है, तो अभिव्यक्ति (पी) + एन (समकक्ष, एन + (पी)) और (पी) -एन (जहां एन का मान है n) इंगित करें, क्रमशः, i + n-th और i - सरणी ऑब्जेक्ट के n-th तत्व, बशर्ते वे मौजूद हों। इसके अलावा, यदि अभिव्यक्ति पी किसी सरणी ऑब्जेक्ट के अंतिम तत्व को इंगित करता है, अभिव्यक्ति (पी) +1 एरे ऑब्जेक्ट के अंतिम तत्व, के पिछले बिंदु से पहले एक बिंदु और यदि अभिव्यक्ति क्यू एक के अंतिम तत्व से पहले एक बिंदु को इंगित करता है सरणी ऑब्जेक्ट, अभिव्यक्ति (क्यू) -1 अंक सरणी ऑब्जेक्ट के अंतिम तत्व को इंगित करती है। यदि दोनों पॉइंटर ऑपरेंड और परिणाम एक ही सरणी ऑब्जेक्ट के तत्वों को इंगित करते हैं, या सरणी ऑब्जेक्ट के अंतिम तत्व के पिछले एक के बाद, मूल्यांकन एक अतिप्रवाह उत्पन्न नहीं करेगा; अन्यथा, व्यवहार अपरिभाषित है।

+0

क्या आप संदर्भ प्रदान कर सकते हैं जहां शून्य सूचक पर अंकगणित करना प्रतिबंधित है? या क्या मैं गलत कह रहा हूं कि आप क्या कह रहे हैं? –

+0

लेकिन यदि 'Var' एक सरणी है, और सूचक नहीं है, तो कोई समस्या नहीं होनी चाहिए। –

+1

@MarkB इसे 'NULL' की कानूनी परिभाषाओं के साथ करना है। यदि 'NULL' को '((शून्य *) 0 के रूप में परिभाषित किया गया है (' (सी में कानूनी, सी ++ में अवैध), तो उस पर कोई अंकगणित करना अवैध है। (और जाहिर है, यदि 'NULL' को केवल' 0' के रूप में परिभाषित किया गया है, तो 'NULL + 0' कानूनी है।) –

2

चूंकि आप पहले पास के बाद तक मानों का उपयोग नहीं कर रहे हैं, सही काम करें और इसके बजाय अपने स्ट्रक्चर के पॉइंटर्स को शून्य पर प्रारंभ करें। फिर जब आप उन्हें जानते हैं तो सही मूल्य डाल दें। यदि आप उस दृष्टिकोण को अपना "कानूनी है" समस्या लेते हैं तो बस चला जाता है!

+0

+1। असल में, 'संरचना संरचना [2];' काफी है। यदि प्रारंभिकरण के परिणाम कभी नहीं उपयोग किए जाते हैं, तो इस प्रारंभिकरण में कोई आवश्यकता नहीं है। –

0

विशिष्ट प्रश्न का उत्तर देने के लिए (उदाहरण कोड भूलना): हाँ, आप अनियमित स्मृति का संदर्भ ले सकते हैं, आप बस dereference नहीं कर सकते हैं और परिभाषित व्यवहार की अपेक्षा कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे