स्थैतिक सरणी पर malloc (विफलता पर पूर्ण वापसी के अलावा) का उपयोग करने का क्या फायदा है? निम्नलिखित कार्यक्रम मेरे सभी राम खाएंगे और केवल लूप को असम्बद्ध होने पर स्वैप भरना शुरू कर देंगे। यह दुर्घटनाग्रस्त नहीं है।मुझे malloc() का उपयोग क्यों करना चाहिए जब "char bigchar [1u << 31 - 1];" ठीक काम करता है?
...
#include <stdio.h>
unsigned int bigint[ 1u << 29 - 1 ];
unsigned char bigchar[ 1u << 31 - 1 ];
int main (int argc, char **argv) {
int i;
/* for (i = 0; i < 1u << 29 - 1; i++) bigint[i] = i; */
/* for (i = 0; i < 1u << 31 - 1; i++) bigchar[i] = i & 0xFF; */
getchar();
return 0;
}
...
कुछ परीक्षण और त्रुटि मैं ऊपर पाया के बाद सबसे बड़ा स्थिर सरणी जीसीसी 4.3 के साथ अपने 32-बिट इंटेल मशीन पर अनुमति दी है। क्या यह एक मानक सीमा है, एक कंपाइलर सीमा, या एक मशीन सीमा? जाहिर है, मैं उनमें से कई को जितना चाहूं उतना प्राप्त कर सकता हूं। यह segfault होगा, लेकिन केवल अगर मैं malloc से अधिक पूछने के लिए (और उपयोग करने की कोशिश) पूछता हूं वैसे भी मुझे दे देंगे।
क्या यह निर्धारित करने का कोई तरीका है कि एक स्थिर सरणी वास्तव में आवंटित की गई थी और उपयोग करने के लिए सुरक्षित थी?
संपादित करें: मुझे दिलचस्पी है कि मैलोक का उपयोग वर्चुअल मेमोरी सिस्टम को संभालने के बजाय ढेर का प्रबंधन करने के लिए क्यों किया जाता है। जाहिर है, मैं आकार के कई बार एक सरणी का आकार बदल सकता हूं, मुझे लगता है कि मुझे आवश्यकता होगी और वर्चुअल मेमोरी सिस्टम केवल राम में ही रहेंगे जो आवश्यक है। अगर मैं कभी नहीं लिखता इन विशाल सरणी के अंत (या शुरुआत) तो प्रोग्राम भौतिक स्मृति का उपयोग नहीं करता है। इसके अलावा, अगर मैं हर स्थान पर लिख सकता हूं तो मैलोक क्या करता है इसके अलावा हीप में एक पॉइंटर बढ़ाता है या उसी प्रक्रिया में पिछले आवंटन के आसपास खोज करता है?
संपादक की टिप्पणी:1 << 31
causes undefined behaviour यदि पूर्णांक 32-बिट है, इसलिए मैं सवाल को संशोधित किया है 1u
पढ़ने के लिए। सवाल का इरादा बड़े स्थैतिक बफर आवंटित करने के बारे में पूछना है।
मुझे नहीं लगता कि यह एक डुप्लिकेट है। मैं प्रश्न को फिर से लिखने के लिए संपादित करूंगा। –