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

C भाषा में अनारंभिकृत सरणी (Uninitialized Array) एक्सेस करना


समस्या

C में यदि सरणी को प्रारंभिकृत (initialize) किए बिना उपयोग किया जाए, तो क्या होता है?

व्यवहार

  • कंपाइलर कोई त्रुटि या चेतावनी नहीं देता (कुछ कंपाइलर -Wall पर चेतावनी दे सकते हैं)।
  • प्रोग्राम सफलतापूर्वक कंपाइल और रन होता है।
  • सरणी तत्वों में कचरा मान (garbage values) होते हैं - जो भी बाइट्स उस मेमोरी में पहले से थे।
  • परिणाम अनिश्चित (unpredictable) और अनिर्धारित व्यवहार (undefined behavior) होता है।

कोड उदाहरण 1

#include <stdio.h>

int main() {
    int a[4];           // अनारंभिकृत
    int b[4] = {1};     // आंशिक: b[0]=1, बाकी 0
    int c[4] = {1,2,3,4}; // पूर्ण प्रारंभिकरण
    int i;
    
    printf("सरणी a (अनारंभिकृत):\n");
    for (i = 0; i < 4; i++)
        printf("a[%d] = %d\n", i, a[i]);
    
    printf("\nसरणी b (आंशिक):\n");
    for (i = 0; i < 4; i++)
        printf("b[%d] = %d\n", i, b[i]);
    
    printf("\nसरणी c (पूर्ण):\n");
    for (i = 0; i < 4; i++)
        printf("c[%d] = %d\n", i, c[i]);
    
    return 0;
}

संभावित आउटपुट (हर रन में अलग)

सरणी a (अनारंभिकृत):
a[0] = 4195872
a[1] = 0
a[2] = 4195408
a[3] = 0

सरणी b (आंशिक):
b[0] = 1
b[1] = 0
b[2] = 0
b[3] = 0

सरणी c (पूर्ण):
c[0] = 1
c[1] = 2
c[2] = 3
c[3] = 4

कोड उदाहरण 2: और कचरा मान

#include <stdio.h>

int main() {
    int A[4];   // अनारंभिकृत
    int B[4];   // अनारंभिकृत
    int C[4] = {1, 2};  // आंशिक
    int i;
    
    printf("A: ");
    for (i = 0; i < 4; i++) printf("%d ", A[i]);
    
    printf("\nB: ");
    for (i = 0; i < 4; i++) printf("%d ", B[i]);
    
    printf("\nC: ");
    for (i = 0; i < 4; i++) printf("%d ", C[i]);
    printf("\n");
    
    return 0;
}

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

A: 4195856 0 4195408 0
B: -915120393 32767 0 0
C: 1 2 0 0

नियम: आंशिक प्रारंभिकरण


int arr[5] = {10, 20};  // arr[0]=10, arr[1]=20, arr[2..4]=0 (स्वचालित शून्य)
int arr[5] = {};        // C23 से मान्य, सभी 0 (GCC/Clang एक्सटेंशन में पहले से)
int arr[5] = {0};       // सभी 0 - सार्वभौमिक तरीका

सर्वोत्तम अभ्यास

✅ हमेशा प्रारंभिकृत करें


// अच्छा
int arr[100] = {0};
int arr[] = {1,2,3,4,5};
int *arr = calloc(n, sizeof(int));  // डायनामिक: शून्य-प्रारंभिकृत

// खराब
int arr[100];  // कचरा मान
int *arr = malloc(n * sizeof(int)); // कचरा मान

क्यों C प्रारंभिकरण अनिवार्य नहीं करता?

  • प्रदर्शन: स्टैक वेरिएबल्स को शून्य करना समय लेता है; C "आप जो मांगते हैं उसके लिए भुगतान करें" दर्शन अपनाता है।
  • निम्न-स्तरीय नियंत्रण: प्रोग्रामर मेमोरी लेआउट नियंत्रित करता है।
  • ऐतिहासिक: प्रारंभिक कंप्यूटर्स में हर चक्र मायने रखता था।

आधुनिक कंपाइलर सहायता

  • gcc -Wall -Wextra -Wuninitialized - चेतावनी देता है।
  • clang -Wuninitialized - बेहतर विश्लेषण।
  • स्टेटिक एनालाइजर्स (Cppcheck, Coverity) अनारंभिकृत उपयोग पकड़ते हैं।
  1. C में ऐरे ऑफ पॉइंटर्स और पॉइंटर टू पॉइंटर C में ऐरे ऑफ पॉइंटर्स और पॉइंटर टू पॉइंटर

    ऐरे ऑफ पॉइंटर्स किसी भी डेटा टाइप की तरह, हम पॉइंटर्स का ऐरे घोषित कर सकते हैं। घोषणा datatype *pointername[size]; उदाहरण: int *p[5]; // 5 इंटीजर एड्रेस रखने वाला पॉइंटर ऐरे आरंभीकरण int a[3] = {10, 20, 30}; int *p[3]; for (i = 0; i < 3; i++) p[i] = &a[i]; // या p[i] = a + i; एक्सेस करना for

  1. C भाषा में कैरेक्टर ऑपरेशन्स को समझें C भाषा में कैरेक्टर ऑपरेशन्स को समझें

    C प्रोग्रामिंग भाषा में कैरेक्टर (A-Z या a-z), अंक (0-9), व्हाइट स्पेस, या विशेष प्रतीक हो सकते हैं। घोषणा (Declaration) C प्रोग्रामिंग में कैरेक्टर ऑपरेशन्स के लिए घोषणा निम्नलिखित है: char a = A; // कैरेक्टर कॉन्स्टेंट का उपयोग करके कैरेक्टर इनपुट/आउटपुट फंक्शन्स कैरेक्टर इनपुट/आउटपुट फंक्शन्स

  1. C भाषा में पॉइंटर एक्सेस करने की अवधारणा C भाषा में पॉइंटर एक्सेस करने की अवधारणा

    पॉइंटर घोषणा, प्रारंभिकरण और एक्सेस 1. सामान्य चर int qty = 179; // मेमोरी में: पता 1000 पर मान 179 संग्रहीत 2. पॉइंटर घोषणा int *p; // p एक पॉइंटर चर है जो int का पता रख सकता है 3. पॉइंटर प्रारंभिकरण int qty = 175; int *p; p = &qty; // एड्रेस-ऑफ ऑपरेटर (&) से पता प्राप्त करें मेमोरी आर