रनटाइम आरंभिकरण (डायनामिक आवंटन)
कंपाइल टाइम पर आकार निश्चित करने के बजाय, रनटाइम पर उपयोगकर्ता इनपुट से आकार लेकर मेमोरी आवंटित करना।
2D सरणी के लिए डायनामिक आवंटन विधियाँ
विधि 1: पॉइंटर्स की सरणी (जैग्ड सरणी)
int **arr = malloc(rows * sizeof(int*));
for (int i = 0; i < rows; i++)
arr[i] = malloc(cols * sizeof(int));
विधि 2: सन्निहित ब्लॉक (कैश-फ्रेंडली)
int *arr = malloc(rows * cols * sizeof(int));
// एक्सेस: arr[i * cols + j]
विधि 3: VLA (Variable Length Array) - C99
int rows, cols;
scanf("%d %d", &rows, &cols);
int arr[rows][cols]; // स्टैक पर, सीमित आकार
उदाहरण प्रोग्राम: दो 2D सरणियों का योग और गुणनफल
#include <stdio.h>
#include <stdlib.h>
int main() {
int rows, cols;
printf("पंक्तियाँ और स्तंभ दर्ज करें: ");
scanf("%d %d", &rows, &cols);
// डायनामिक आवंटन (विधि 2: सन्निहित)
int *A = malloc(rows * cols * sizeof(int));
int *B = malloc(rows * cols * sizeof(int));
int *sum = malloc(rows * cols * sizeof(int));
int *prod = malloc(rows * cols * sizeof(int));
if (!A || !B || !sum || !prod) {
printf("मेमोरी आवंटन विफल\n");
return 1;
}
// मैक्रो/फंक्शन के लिए एक्सेस सहायक
#define AT(arr, i, j) arr[(i)*cols + (j)]
// इनपुट 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", &AT(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", &AT(B, i, j));
}
// योग और गुणनफल
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
AT(sum, i, j) = AT(A, i, j) + AT(B, i, j);
AT(prod, i, j) = AT(A, i, j) * AT(B, i, j);
}
}
// आउटपुट
printf("\nयोग सरणी:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
printf("%d\t", AT(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", AT(prod, i, j));
printf("\n");
}
// मुक्त करें
free(A); free(B); free(sum); free(prod);
return 0;
}
आउटपुट उदाहरण
पंक्तियाँ और स्तंभ दर्ज करें: 2 3 सरणी A के तत्व: A[0][0]: 1 A[0][1]: 2 A[0][2]: 3 A[1][0]: 4 A[1][1]: 5 A[1][2]: 6 सरणी B के तत्व: B[0][0]: 10 B[0][1]: 20 B[0][2]: 30 B[1][0]: 40 B[1][1]: 50 B[1][2]: 60 योग सरणी: 11 22 33 44 55 66 गुणनफल सरणी: 10 40 90 160 250 360
मूल प्रोग्राम की समस्याएं (सुधार)
मूल कोड में कई बग थे:
int sum[i][j]- VLA घोषणा लूप के अंदर गलत स्थान परscanfप्रॉम्प्ट्स लेकिन कोई इनपुट नहीं (आउटपुट में 0 दिखा)- कोई मेमोरी मुक्ति नहीं
- त्रुटि जांच नहीं
सर्वोत्तम अभ्यास
- बड़े सरणियों के लिए malloc/free उपयोग करें (स्टैक ओवरफ्लो से बचने)
- सन्निहित आवंटन (विधि 2) कैश प्रदर्शन के लिए बेहतर
- हमेशा
mallocरिटर्न मान जांचें free()से मेमोरी मुक्त करें- एक्सेस के लिए मैक्रो या इंलाइन फंक्शन उपयोग करें