सरणी आरंभिकरण के दो तरीके
1. कंपाइल टाइम आरंभिकरण (Compile-time Initialization)
मान प्रोग्राम में ही निश्चित होते हैं।
सिंटैक्स
type name[size] = { value_list };
// उदाहरण
int roll[4] = {2, 5, 6, 7};
float area[5] = {23.4, 6.8, 5.5, 7.3, 2.4};
char name[9] = {'T','u','t','o','r','i','a','l','\0'};
char str[] = "Tutorial"; // आकार स्वतः, \0 शामिल
नियम
- कम मान दिए जाने पर शेष स्वतः 0 होते हैं
int a[5] = {1,2};→{1,2,0,0,0}- आकार छोड़ने पर (
[]) तत्वों की संख्या से आकार निर्धारित - आकार दिए गए मानों से कम नहीं हो सकता
उदाहरण प्रोग्राम
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
printf("कंपाइल-टाइम आरंभिकृत सरणी:\n");
for (int i = 0; i < 5; i++)
printf("arr[%d] = %d\n", i, arr[i]);
return 0;
}
2. रनटाइम आरंभिकरण (Runtime Initialization)
उपयोगकर्ता इनपुट या गणना से मान प्राप्त करना। इसे डायनामिक आरंभिकरण भी कहते हैं।
विधि: scanf() से इनपुट
int n;
printf("आकार: ");
scanf("%d", &n);
int arr[n]; // VLA (C99) या malloc
for (int i = 0; i < n; i++) {
printf("arr[%d]: ", i);
scanf("%d", &arr[i]);
}
उदाहरण प्रोग्राम: दो 2D सरणियों का योग/गुणनफल
#include <stdio.h>
#include <stdlib.h>
int main() {
int rows, cols;
printf("पंक्तियाँ स्तंभ: ");
scanf("%d %d", &rows, &cols);
// VLA (स्टैक, सीमित आकार)
int A[rows][cols], B[rows][cols];
int sum[rows][cols], prod[rows][cols];
// इनपुट A
printf("सरणी A:\n");
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++) {
printf("A[%d][%d]: ", i, j);
scanf("%d", &A[i][j]);
}
// इनपुट B
printf("सरणी B:\n");
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++) {
printf("B[%d][%d]: ", i, j);
scanf("%d", &B[i][j]);
}
// गणना
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
sum[i][j] = A[i][j] + B[i][j];
prod[i][j] = A[i][j] * B[i][j];
}
}
// आउटपुट
printf("\nयोग:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
printf("%d\t", sum[i][j]);
printf("\n");
}
printf("\nगुणनफल:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
printf("%d\t", prod[i][j]);
printf("\n");
}
return 0;
}
तुलना
| पहलू | कंपाइल टाइम | रनटाइम |
|---|---|---|
| लचीलापन | निश्चित आकार/मान | उपयोगकर्ता/डेटा अनुसार |
| मेमोरी | स्टैक/डेटा सेगमेंट | स्टैक (VLA) या हीप (malloc) |
| प्रदर्शन | थोड़ा तेज (कोई रनटाइम लागत नहीं) | आवंटन ओवरहेड |
| उपयोग | ज्ञात स्थिर डेटा | उपयोगकर्ता इनपुट, फाइल डेटा, गणना |
मूल प्रोग्राम की बग्स (सुधार)
int sum[i][j]- VLA घोषणा लूप के अंदर, अप्रारंभिकृतi,jके साथ- कोई इनपुट नहीं होने पर भी आउटपुट लूप चलते थे → कचरा मान
- कोई त्रुटि जांच नहीं
सर्वोत्तम अभ्यास
- छोटे, ज्ञात आकार के लिए कंपाइल-टाइम/स्टैक (VLA)
- बड़े/अज्ञात आकार के लिए
malloc/free(हीप) - हमेशा इनपुट सत्यापन करें
- VLA सावधानी से: स्टैक ओवरफ्लो संभव