समस्या
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) अनारंभिकृत उपयोग पकड़ते हैं।