Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C भाषा में सरणी सूचकांक आउट ऑफ बाउंड्स (Out of Bounds)


आउट ऑफ बाउंड्स क्या है?

यदि सरणी का आकार n है, तो वैध सूचकांक 0 से n-1 तक होते हैं। इस सीमा से बाहर किसी सूचकांक को एक्सेस करना "आउट ऑफ बाउंड्स" कहलाता है।

व्यवहार

  • कंपाइलर आमतौर पर त्रुटि नहीं देता (C बाउंड्स चेक नहीं करता)।
  • प्रोग्राम कंपाइल और रन हो जाता है।
  • परिणाम अनिश्चित (Undefined Behavior - UB) होता है:
      li>कचरा मान पढ़ना li>अन्य चर को भ्रष्ट करना li>प्रोग्राम क्रैश (सेगफॉल्ट) li>सुरक्षा भेद्यता (बफर ओवरफ्लो)

उदाहरण प्रोग्राम

#include <stdio.h>

int main() {
    int std[4];  // आकार 4: वैध सूचकांक 0,1,2,3
    int i;
    
    std[0] = 100;  // वैध
    std[1] = 200;  // वैध
    std[2] = 300;  // वैध
    std[3] = 400;  // वैध
    std[4] = 500;  // ❌ आउट ऑफ बाउंड्स!
    
    printf("सभी तत्व प्रिंट (0 से 4 तक):\n");
    for (i = 0; i < 5; i++)
        printf("std[%d] = %d\n", i, std[i]);
    
    return 0;
}

संभावित आउटपुट

std[0] = 100
std[1] = 200
std[2] = 300
std[3] = 400
std[4] = 2314   ← कचरा मान (500 नहीं!)

व्याख्या

std[4] सरणी की सीमा से बाहर है। कंपाइलर ने इसे नहीं रोका। मान 500 असाइन हुआ लेकिन प्रिंट 2314 आया क्योंकि:

  1. वह मेमोरी किसी अन्य चर/डेटा का हिस्सा हो सकती है।
  2. कंपाइलर ऑप्टिमाइजेशन के कारण स्टोर ऑप्टिमाइज़ हो गया हो।
  3. स्टैक लेआउट के कारण ओवरलैप।

आउट ऑफ बाउंड्स के प्रकार

प्रकारउदाहरणपरिणाम
पढ़नाx = arr[10];कचरा मान, संभावित क्रैश
लिखनाarr[10] = 5;मेमोरी भ्रष्टाचार, सुरक्षा छेद
पॉइंटर अंकगणित*(arr + 10)समान UB

पता लगाने के उपकरण

🔍 डिबगिंग टूल्स

  • AddressSanitizer (ASan): gcc -fsanitize=address -g - रनटाइम पर पकड़ता है
  • Valgrind: valgrind ./program - मेमोरी त्रुटियाँ ढूंढता है
  • Static Analysis: cppcheck --enable=all, clang-tidy
  • Compiler Warnings: -Wall -Warray-bounds (सीमित)

रोकथाम के तरीके


// 1. स्थिर सरणी: आकार स्थिरांक में रखें
#define SIZE 10
int arr[SIZE];
for (int i = 0; i < SIZE; i++) ...

// 2. डायनामिक: आकार वेरिएबल में रखें
int *arr = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) ...

// 3. फंक्शन में आकार पास करें
void process(int *arr, int size) { ... }

// 4. एसर्टन उपयोग करें (डिबग बिल्ड)
assert(index >= 0 && index < size);

// 5. C11: एनोटेशन (कंपाइलर सहायता)
void func(int arr[static 10]);  // कम से कम 10 तत्व

सुरक्षा निहितार्थ

बफर ओवरफ्लो (आउट ऑफ बाउंड्स लिखना) सबसे आम सुरक्षा भेद्यता है। इससे हमलावर मनमाना कोड निष्पादित कर सकते हैं। आधुनिक सुरक्षा: Stack Canaries, ASLR, DEP, बाउंड्स चेकिंग कंपाइलर (Hardened GCC/Clang)।

  1. - C# में ऐरे क्या है

    एक ऐरे एक ही प्रकार के एलिमेंट्स के फिक्स्ड-साइज़ सीक्वेंशियल कलेक्शन को स्टोर करता है। एक ऐरे का उपयोग डेटा के कलेक्शन को स्टोर करने के लिए किया जाता है, लेकिन अक्सर ऐरे को एक ही प्रकार के वेरिएबल्स के कलेक्शन के रूप में सोचना अधिक उपयोगी होता है जो सन्निहित मेमोरी लोकेशन्स पर स्टोर होते हैं। C# मे

  1. - C# में ऐरे क्लास क्या है

    Array क्लास C# में सभी ऐरे का बेस क्लास है। यह System नेमस्पेस में परिभाषित है। Array क्लास ऐरे के साथ काम करने के लिए विभिन्न प्रॉपर्टीज़ और मेथड्स प्रदान करती है। Array क्लास की प्रॉपर्टीज़ निम्नलिखित हैं - नीचे दी गई टेबल Array क्लास की सबसे अधिक उपयोग की जाने वाली प्रॉपर्टीज़ का वर्णन करती है।

  1. Java में ArrayIndexOutOfBoundsException क्या है? Java में ArrayIndexOutOfBoundsException क्या है?

    एक सरणी एक डेटा संरचना/कंटेनर/ऑब्जेक्ट है जो एक ही प्रकार के तत्वों का एक निश्चित आकार का अनुक्रमिक संग्रह संग्रहीत करता है। सरणी का आकार/लंबाई निर्माण के समय निर्धारित की जाती है। सरणी में तत्वों की स्थिति को इंडेक्स या सबस्क्रिप्ट कहा जाता है। सरणी का पहला तत्व इंडेक्स 0 पर संग्रहीत होता है और, दू