सरणी एक प्रकार की डेटा स्ट्रक्चर है जो समान प्रकार के एलिमेंट्स का निश्चित आकार का अनुक्रमिक संग्रह स्टोर कर सकती है।
सरणी का उपयोग डेटा के संग्रह को स्टोर करने के लिए किया जाता है, लेकिन सरणी को समान प्रकार के वेरिएबल्स के संग्रह के रूप में सोचना अधिक उपयोगी होता है।
सीमाएं (Limitations)
सरणी की सीमाएं नीचे बताई गई हैं:
- सजातीय (Homogeneous) डेटा - एक सरणी सजातीय होती है। यानी, इंटीजर सरणी में केवल इंटीजर मान स्टोर हो सकते हैं, फ्लोट सरणी में केवल फ्लोटिंग मान, और कैरेक्टर सरणी में केवल कैरेक्टर्स। इस प्रकार, कोई सरणी दो डेटा टाइप्स के मान नहीं रख सकती।
- निश्चित आकार (Fixed Size) - सरणी घोषित करते समय आकार पास करना अनिवार्य है, और आकार एक कॉन्स्टेंट होना चाहिए। इस प्रकार, मेमोरी की या तो कमी या बर्बादी होती है।
- शिफ्टिंग आवश्यक - सरणी में एलिमेंट्स के इन्सर्शन या डिलीशन के लिए शिफ्टिंग आवश्यक होती है।
- बाउंड्स चेकिंग नहीं - C भाषा में, हम चेक नहीं कर सकते कि सरणी में दर्ज मान उस सरणी के आकार से अधिक तो नहीं हैं।
- आउट-ऑफ-बाउंड्स एक्सेस - सबस्क्रिप्ट के साथ दर्ज डेटा सरणी आकार से अधिक होने पर सरणी के बाहर रखा जाता है। आमतौर पर डेटा के शीर्ष पर या प्रोग्राम पर ही।
- अनप्रेडिक्टेबल परिणाम - इससे कम से कम अनप्रेडिक्टेबल परिणाम होते हैं। सरणी आकार से आगे जाने पर प्रोग्रामर को चेतावनी देने के लिए कोई एरर मैसेज नहीं होता। कुछ मामलों में प्रोग्राम हैंग हो सकता है।
समस्या प्रदर्शित करने वाला प्रोग्राम
int a[10], i;
for(i = 0; i <= 20; i++)
a[i] = i; // बाउंड्स ओवरफ्लो - अनिर्दिष्ट व्यवहार
उदाहरण प्रोग्राम: दो सरणियों का योग
#include <stdio.h>
void main() {
// कंपाइल टाइम आरंभीकरण के साथ सरणी घोषित करना
int array1[5], array2[5], sum[5];
int i;
printf("Enter values of array1:\n");
for(i = 0; i < 5; i++) {
printf("array1[%d]: ", i);
scanf("%d", &array1[i]);
}
printf("Enter values of array2:\n");
for(i = 0; i < 5; i++) {
printf("array2[%d]: ", i);
scanf("%d", &array2[i]);
}
printf("Elements in the sum of array1 and array2:\n");
for(i = 0; i < 5; i++) {
sum[i] = array1[i] + array2[i];
printf("%d ", sum[i]);
}
}
आउटपुट
Enter values of array1: array1[0]: 2 array1[1]: 3 array1[2]: 1 array1[3]: 2 array1[4]: 3 Enter values of array2: array2[0]: 4 array2[1]: 5 array2[2]: 3 array2[3]: 2 array2[4]: 1 Elements in the sum of array1 and array2: 6 8 4 4 4
सरणी की सीमाओं के समाधान
| सीमा | समाधान |
|---|---|
| निश्चित आकार | डायनामिक मेमोरी आवंटन (malloc, realloc) |
| सजातीय डेटा | स्ट्रक्चर्स (struct) या यूनियन्स (union) |
| इन्सर्शन/डिलीशन पर शिफ्टिंग | लिंक्ड लिस्ट, डायनामिक एरे (वेक्टर) |
| बाउंड्स चेकिंग नहीं | मैन्युअल चेक्स, सुरक्षित लाइब्रेरीज, बाउंड्स-चेकिंग कंपाइलर एक्सटेंशन्स |
| मेमोरी बर्बादी/कमी | डायनामिक सरणी (वेक्टर-जैसी वृद्धि रणनीति) |
आधुनिक विकल्प
- C++ STL:
std::vector,std::array,std::list - C में: डायनामिक सरणी कार्यान्वयन, फ्लेक्सिबल एरे मेंबर्स (C99), थर्ड-पार्टी लाइब्रेरीज