Out of index C/C++ -


सी / सी ++ में एक सरणी के लिए एक विशिष्ट घोषणा है:

प्रकार का नाम [तत्व]; < / P>

जहां एक प्रकार वैध है (जैसे कि इंट, फ्लोट ...), नाम एक मान्य पहचानकर्ता और तत्व फ़ील्ड है (जो हमेशा चौकोर ब्रैकेट्स [] में संलग्न होता है), सरणी की लंबाई को निर्दिष्ट करता है तत्वों की संख्या के संदर्भ में।

इसलिए मैं एक सरणी की घोषणा करता हूँ जिसमें 2 तत्व हैं

  int a [2]; एक [3] = 4;  

क्यों यह अपवाद नहीं फेंकते?

सीमा से बाहर की जाँच कुछ ऐसा है जो आप संभवतः जावा जैसे कुछ उच्च स्तर की भाषा से उपयोग किया जाता है। हालांकि सी / सी ++ में यह डिफ़ॉल्ट रूप से नहीं किया जाता है। यह आपको सरणी की सीमाओं की जांच करने के लिए एक छोटा प्रदर्शन हिट देता है और इसलिए सी तर्क यह है कि आप इसे स्वयं मैन्युअल रूप से कर सकते हैं, जब तक आप इसे सर्वश्रेष्ठ संभव प्रदर्शन की पेशकश कर सकते हैं। सी + + एसटीएल कंटेनर जैसे वेक्टर आमतौर पर एक पर () ऑपरेशन को बाध्य जांच करने के लिए समर्थन देता है और चूंकि आप [] अधिभार लोड कर सकते हैं - आप सरणी के लिए बाउंड-चेक सक्षम कर सकते हैं -स्टाइल एक्सेस।

यदि सरणी एक कच्चे पॉइंटर है तो सरणी [i] जैसा एक स्टेटमेंट सी / सी ++ में नीचे आता है:

<पूर्व> * (सरणी + i)

जो एक आसान पते का + ऑफसेट है इस प्रकार निम्नलिखित बयानों का समतुल्य है:

  * (array + i), * (i + सरणी), सरणी [i], i [सरणी]  

आंतरिक रूप से क्या होता है कि आप सूचक में संग्रहीत पता लेते हैं, उसमें सरणी प्रकार के आकार को मैं-बार जोड़ कर और उसके बाद इस पते पर डी-रेफरेंस

तो क्या होता है यदि आप एक इंडेक्स निर्दिष्ट करते हैं जो सरणी से बड़ा है, तो यह है कि आप मेमोरी का उपयोग कर सकते हैं जो सरणी से संबंधित नहीं है। प्रभावी ढंग से आप यादृच्छिक डेटा पढ़ते हैं जो स्मृति में सरणी के बगल में है। यह बफर-ओवरफ्लो का एक विशिष्ट स्रोत है यदि पते को लिखा है। यदि आप जिस मेमोरी का उपयोग करने का प्रयास कर रहे हैं वह आपकी प्रक्रिया से संबंधित नहीं है, तो आपको एक सेगफ़ॉल्ट मिलेगा।


Comments

Popular posts from this blog

regex - PatternSyntaxException: while using String.ReplaceAll function in java? -

java - Projects which are accessed via multiple (different) IDEs: Ant or Maven? -