मैं यह सोचते हैं रहा है कि Var
एक सूचक वस्तु है और इसके वर्तमान मूल्य एक अशक्त सूचक है। यह आपके कथन द्वारा निहित है:
Var
इस संरचना को भरने के लिए पहली बार अनियमित किया गया है। (के रूप में: NULL
)
मैं भी यह सोचते हैं रहा है कि Var
ब्लॉक गुंजाइश पर परिभाषित नहीं है। यदि यह ब्लॉक स्कोप पर परिभाषित किया गया है, और आपने इसे प्रारंभ नहीं किया है या इसके लिए कोई मान असाइन नहीं किया है, तो इसका मान कचरा है, जरूरी नहीं कि एक शून्य सूचक मूल्य, और उसके मान को संदर्भित करने के किसी भी प्रयास में अपरिभाषित व्यवहार है।
व्यवहार अपरिभाषित है।
तो Var == NULL
, तो &Var[N]
व्यवहार अपरिभाषित है।
arr[index]
परिभाषा *(arr + index)
के बराबर से है, इसलिए &Var[N]
&(*(Var + N))
के बराबर है। पॉइंटर अंकगणितीय का व्यवहार सरणी ऑब्जेक्ट के तत्वों के संदर्भ में परिभाषित किया जाता है जिसमें पॉइंटर पॉइंट (एक ऑब्जेक्ट के साथ एक-तत्व सरणी के रूप में माना जाता है) और एक शून्य सूचक कुछ भी इंगित नहीं करता है।
एक विषयांतर:
सी स्पष्ट रूप से कहा गया है कि &*x
x
के रूप में मूल्यांकन किया जाता है, और &[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 अंक सरणी ऑब्जेक्ट के अंतिम तत्व को इंगित करती है। यदि दोनों पॉइंटर ऑपरेंड और परिणाम एक ही सरणी ऑब्जेक्ट के तत्वों को इंगित करते हैं, या सरणी ऑब्जेक्ट के अंतिम तत्व के पिछले एक के बाद, मूल्यांकन एक अतिप्रवाह उत्पन्न नहीं करेगा; अन्यथा, व्यवहार अपरिभाषित है।
मैं निश्चित रूप से निश्चित हूं कि उत्तर नहीं है, और कुछ अनुकूलक आपके कोड को तोड़ देंगे। – SLaks
"या मुझे इस स्थिति के लिए एक अलग तरह की दृष्टिकोण की आवश्यकता है?" हम्म, शायद, चर शुरू करें? –
@ DanielDaranas मैं हूँ। हालांकि केवल सरणी भरने के बाद ही भर दिया गया है। यह एक ऐसा कार्य है जिसे कई बार कहा जाता है। – ATaylor