मैं समझता हूं कि हार्डवेयर प्रोग्राम निष्पादन के दौरान आवंटित स्मृति की मात्रा को सीमित करेगा। हालांकि, हार्डवेयर के संबंध में मेरा प्रश्न है। मानते हैं कि स्मृति की मात्रा की कोई सीमा नहीं थी, क्या सरणी की कोई सीमा नहीं होगी?सी में सरणी का अधिकतम आकार क्या है?
उत्तर
कोई तय सी
किसी भी सरणी वस्तु के सहित किसी एक वस्तु का आकार, में एक सरणी के आकार के सीमा नहीं है, SIZE_MAX
, प्रकार size_t
का अधिकतम मान, द्वारा सीमित है जो sizeof
ऑपरेटर का नतीजा है। (यह पूरी तरह से स्पष्ट नहीं है कि सी मानक SIZE_MAX
बाइट्स से बड़ी वस्तुओं को अनुमति देता है, लेकिन व्यवहार में ऐसी वस्तुएं समर्थित नहीं हैं; फुटनोट देखें।) SIZE_MAX
कार्यान्वयन द्वारा निर्धारित किया गया है, और किसी भी प्रोग्राम द्वारा संशोधित नहीं किया जा सकता है, जो ऊपरी बाउंड लगाता है किसी भी ऑब्जेक्ट के लिए SIZE_MAX
बाइट्स का।
void*
प्रकार की चौड़ाई, एक सामान्य सूचक प्रकार, निष्पादन कार्यक्रम में सभी ऑब्जेक्ट्स के कुल आकार पर ऊपरी सीमा लगाता है (जो एक ऑब्जेक्ट के अधिकतम आकार से बड़ा हो सकता है)।
सी मानक इन निश्चित आकारों पर, निम्न सीमाओं को लागू करता है, लेकिन ऊपरी सीमाएं नहीं लगाता है। कोई अनुरूप सी कार्यान्वयन अनंत आकार की वस्तुओं का समर्थन कर सकता है, लेकिन यह किसी भी सीमित आकार के सिद्धांतों का समर्थन कर सकता है। व्यक्तिगत सी कार्यान्वयन द्वारा ऊपरी सीमाएं लगाई जाती हैं, जिन वातावरण में वे काम करते हैं, और भौतिकी द्वारा, भाषा द्वारा नहीं।
उदाहरण के लिए, एक अनुरूप कार्यान्वयन जिसका मतलब है कि यह सिद्धांत में 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137215 बाइट तक वस्तुओं हो सकता था SIZE_MAX
बराबर 2 को -1 हो सकता था,।
गुड लक ढूंढने वाले हार्डवेयर जो वास्तव में ऐसी वस्तुओं का समर्थन करते हैं।
फ़ुटनोट: वहाँ कोई स्पष्ट नियम है कि कोई भी वस्तु से बड़े SIZE_MAX
बाइट्स हो सकता है। आप इस तरह के ऑब्जेक्ट पर sizeof
ऑपरेटर को उपयोगी रूप से लागू नहीं कर सके, लेकिन किसी भी अन्य ऑपरेटर की तरह, sizeof
अतिप्रवाह हो सकता है; इसका मतलब यह नहीं है कि आप ऐसी वस्तु पर संचालन नहीं कर सके। लेकिन व्यावहारिक रूप से, किसी भी साधु कार्यान्वयन size_t
को किसी भी ऑब्जेक्ट के आकार का प्रतिनिधित्व करने के लिए काफी बड़ा कर देगा।
क्या मैं उस अधिकतम विस्तार के लिए मनमाने ढंग से सटीक लाइब्रेरी का उपयोग नहीं कर सका? मेरा मतलब है, सैद्धांतिक रूप से बोल रहा है ...: पी –
@ जे.सी.Leitão: सिद्धांत रूप में, मुझे लगता है कि एक कंपाइलर बहुत व्यापक पूर्णांक प्रकारों को लागू करने के लिए एक मनमाना सटीक पुस्तकालय का उपयोग कर सकता है। लेकिन आप इसे प्रोग्रामर के रूप में नहीं कर सकते; वास्तविक पूर्णांक प्रकार (अक्षर, ऑपरेटरों और इतने आगे के साथ) संकलक प्रदान करता है जो सीमित हैं। –
[दूर पॉइंटर्स] (http://en.wikipedia.org/wiki/Far_pointer) का अस्तित्व है और correspoing स्मृति मॉडल किसी भी तरह से आपका जवाब बदलता है? – jfs
मुझे लगता है कि सबसे बड़ी सैद्धांतिक सरणी "अहस्ताक्षरित लंबे" (या जो भी सबसे बड़ी पूर्णांक संख्या नवीनतम मानक/अपने संकलक का समर्थन करता है) की अधिकतम मूल्य होगा
स्मृति के लिए संबंध, एक सरणी के अधिकतम आकार के बिना सरणी को इंडेक्स करने के लिए उपयोग किए गए पूर्णांक के प्रकार से सीमित है।
एक 64-बिट मशीन सैद्धांतिक रूप से स्मृति के अधिकतम 2^64 बाइट्स को संबोधित कर सकती है।
द्वारा सीमित किया जाएगा, उस भाग को कंप्यूटर में उस मात्रा में डालने की शुभकामनाएं। मूर के कानून के साथ भी यह एक लंबा समय आ रहा है। –
मैं कल्पना कर सकता हूं कि यह मेरे जीवनकाल में हो रहा है। –
@AmigableClarkKant संपूर्ण * पृथ्वी * 2^64 परमाणुओं से कम है (यह केवल 5 * 10^24 किलोग्राम वजन) है, इसलिए आपकी उम्मीदें * बहुत * * बहुत * अतिव्यापी हैं। SCNR। – Durandal
पॉइंटर का आकार उस स्मृति को सीमित करेगा जो आप एक्सेस करने में सक्षम हैं। यहां तक कि यदि हार्डवेयर असीमित मेमोरी के लिए समर्थन प्रदान करता है, यदि आप सबसे बड़ा डेटाटाइप उपयोग करने में सक्षम हैं, तो 64 बिट है, तो आप केवल 2^64 बाइट्स मेमोरी तक पहुंच पाएंगे।
मैं एक सरणी के लिए अधिकतम आकार निर्धारित करने का एक तरीका ढूंढ रहा था। यह सवाल ऐसा ही प्रतीत होता है, इसलिए मैं अपने निष्कर्ष साझा करना चाहता हूं।
प्रारंभ में, सी संकलन समय में किसी सरणी में आवंटित तत्वों की अधिकतम संख्या निर्धारित करने के लिए कोई फ़ंक्शन प्रदान नहीं करता है। ऐसा इसलिए है क्योंकि यह मशीन में उपलब्ध स्मृति की निर्भर करेगा जहां इसे निष्पादित किया जाएगा।
दूसरी ओर, मुझे पता चला है कि स्मृति आवंटन कार्य (calloc()
और malloc()
) बड़े सरणी आवंटित करने में सक्षम हैं। इसके अलावा, ये फ़ंक्शंस आपको रनटाइम मेमोरी आवंटन त्रुटियों को संभालने की अनुमति देता है।
उम्मीद है कि मदद करता है।
C99 5.2.4.1 "अनुवाद सीमा" न्यूनतम आकार
कार्यान्वयन का अनुवाद करने और कम से कम एक प्रोग्राम है जो निम्नलिखित सीमा में से हर एक की कम से कम एक उदाहरण में शामिल है निष्पादित करने में सक्षम हो जाएगा: 13) एक वस्तु में
- 65535 बाइट (एक की मेजबानी की पर्यावरण केवल)
13) क्रियान्वयन shou में जब भी संभव हो, निश्चित अनुवाद सीमा लागू करने से बचें।
यह बताता है कि एक अनुरूप कार्यान्वयन short
बाइट्स के साथ किसी ऑब्जेक्ट (जिसमें सरणी शामिल है) को संकलित करने से इंकार कर सकता है।
9 जब दो संकेत घटाया जाता है, दोनों को इंगित करेगा:
PTRDIFF_MAX
स्थिर सरणी के लिए एक व्यावहारिक सीमा वस्तुओंC99 मानक 6.5.6 Additive ऑपरेटरों कहते हो रहा है उसी सरणी ऑब्जेक्ट के तत्व, या सरणी ऑब्जेक्ट के अंतिम तत्व से पहले एक; नतीजा दो सरणी तत्वों की सबस्क्रिप्ट का अंतर है। परिणाम का आकार कार्यान्वयन-परिभाषित है, और इसके प्रकार (एक हस्ताक्षरित पूर्णांक प्रकार)
<stddef.h>
शीर्षलेख में परिभाषित है। यदि परिणाम उस प्रकार की किसी वस्तु में प्रतिनिधित्व योग्य नहीं है, तो व्यवहार अपरिभाषित है।
जो मेरा तात्पर्य है कि ptrdiff_t
से बड़े सरणी सिद्धांत में अनुमत हैं, लेकिन फिर आप पोर्टेबल रूप से उनके पते का अंतर नहीं ले सकते हैं।
तो शायद इस कारण से, जीसीसी आपको ptrdiff_t
तक सीमित कर रहा है। यह भी उल्लेख किया गया है: Why is the maximum size of an array "too large"?
मैं अनुभव main.c
के साथ इस सत्यापित कर ली है
#include <stdint.h>
uint8_t a[(X)];
int main(void) {
return 0;
}
और फिर Ubunbu 17 में।10:
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 7.2.0-6ubuntu1) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ printf '
> #include <stdint.h>
> PTRDIFF_MAX
> SIZE_MAX
> ' | arm-linux-gnueabi-cpp | tail -n2
(2147483647)
(4294967295U)
$ PTRDIFF_MAX == 2147483647 == 2^31 - 1
$
$ # 2lu << 30 == 2^31 == PTRDIFF_MAX + 1
$ arm-linux-gnueabi-gcc -std=c99 -DX='(2lu << 30)' main.c
a.c:5:9: error: size of array ‘a’ is too large
uint8_t a[(X)];
^
$
$ # PTRDIFF_MAX
$ arm-linux-gnueabi-gcc -std=c99 -DX='(2lu << 30) - 1lu' main.c
$
भी
- 1. PHP: क्या सरणी अधिकतम आकार है?
- 2. सी/सी ++ प्रोग्राम का अधिकतम ढेर आकार
- 3. $ _POST अधिकतम सरणी आकार
- 4. सी # में स्ट्रिंग के लिए अधिकतम आकार क्या है?
- 5. जेपीईजी मेटाडेटा का अधिकतम आकार क्या है?
- 6. Web.config का अधिकतम आकार क्या है?
- 7. ईडब्ल्यूएस में आइटमव्यू का अधिकतम आकार क्या है?
- 8. फायरबर्ड में प्राथमिक कुंजी का अधिकतम आकार क्या है?
- 9. एक वर्चर (अधिकतम) चर का अधिकतम आकार
- 10. सी सरणी आकार gdb
- 11. सी स्थिर सरणी आकार
- 12. अधिकतम आकार?
- 13. सी ++ सरणी आकार
- 14. आईपैड पर अधिकतम सैंडबॉक्स आकार क्या है?
- 15. गिट में अधिकतम फ़ाइल आकार और अधिकतम भंडार आकार?
- 16. अधिकतम प्रतिबद्ध संदेश का आकार
- 17. सी में गतिशील आकार का सरणी कैसे बनाएं?
- 18. एंड्रॉइड पर SQLite डेटाबेस का अधिकतम आकार क्या है?
- 19. अधिकतम आकार डेटा
- 20. सी में 0-लंबाई सरणी का महत्व क्या है?
- 21. एंड्रॉइड सी 2 डीएम पंजीकरण_आईडी अधिकतम आकार
- 22. ब्लॉबप्रोपर्टी (एपेंगेन) में अधिकतम आकार
- 23. सी ++ सरणी के गतिशील आकार
- 24. किसी अन्य सरणी में एक सरणी का आकार
- 25. सी # अप्रबंधित वस्तु का आकार क्या है?
- 26. मैं सी में सरणी का आकार कैसे बदल सकता हूं?
- 27. सी में आकार चलाने पर सरणी का आकार निर्धारित किया जा सकता है?
- 28. अधिकतम सरणी लंबाई कोटा
- 29. एंड्रॉइड कर्सर अधिकतम आकार
- 30. SmtpClient.Send लगाव अधिकतम आकार
वास्तव में सॉफ्टवेयर (ओएस) देखें बात यह है कि सामान्य रूप से स्मृति सीमा आपकी सी कार्यक्रम के द्वारा देखा कारण होगा है। – TJD
स्मृति पर एक सीमा के बिना, सूचक आकार पर कोई सीमा नहीं है। सूचक आकार पर सीमा के बिना, सभी दांव बंद हैं। – dasblinkenlight
यह सूचक के आकार (32 बिट बनाम 64 बिट) –