2012-07-15 12 views
13

स्पष्टीकरण: यह देखते हुए कि एक स्ट्रिंग शाब्दिक (देखें नीचे) एक const char[] के रूप में लिखा जा सकता है, पर char[] से शाब्दिक पर एक कम अधिकतम लंबाई भव्य रों सिर्फ एक वाक्यात्मक असुविधा है। सी मानक क्यों प्रोत्साहित करता है? एक चरित्र स्ट्रिंग मेंसी स्ट्रिंग की अधिकतम लंबाई अधिकतम चार [] से अलग शाब्दिक क्यों है?

509 पात्रों शाब्दिक या विस्तृत स्ट्रिंग (संयोजन के बाद) शाब्दिक

वहाँ नहीं है एक:


C89 मानक स्ट्रिंग शाब्दिक के लिए एक अनुवाद सीमा होती है एक चार सरणी के लिए सीमा; एक वस्तु में शायद

32767 बाइट्स (केवल एक की मेजबानी की स्थिति में)

लागू होता है (मुझे यकीन है कि क्या वस्तु या की मेजबानी पर्यावरण का मतलब है नहीं कर रहा हूँ), लेकिन किसी भी दर पर एक बहुत अधिक सीमा है।

मेरे समझ के साथ कि एक स्ट्रिंग शाब्दिक चार सरणी युक्त वर्ण, यानी के बराबर है है: यह

static const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' }; 
const char* str = __THE_LITERAL; 

तो क्यों एक ऐसे में

const char* str = "foo"; 

: यह हमेशा कुछ इस तरह के पुनर्लेखन के लिए संभव है शाब्दिक पर कठोर सीमा?

+6

यह बहुत अजीब है कि उन्होंने 65533 या 253 के बजाय 50 9 का चयन किया। –

+3

आप इस लेख को पढ़ना चाहेंगे: http://msdn.microsoft.com/en-us/library/sx08afx2.aspx –

+2

कार्यक्रम पर सीमाएं * स्रोत * संकलित कार्यक्रम पर सीमाओं के साथ कुछ भी नहीं है। –

उत्तर

14

स्ट्रिंग अक्षर पर सीमा एक संकलन-समय आवश्यकता है; लॉजिकल स्रोत लाइन की लंबाई पर एक समान सीमा है। एक कंपाइलर स्रोत लाइनों और स्ट्रिंग अक्षर को पकड़ने के लिए एक निश्चित आकार की डेटा संरचना का उपयोग कर सकता है।

(सी 99 इन विशेष सीमाओं को 50 9 से 40 9 5 वर्णों तक बढ़ाता है।)

दूसरी ओर, एक वस्तु (जैसे कि char की सरणी) रन टाइम पर बनाई जा सकती है। संकलक के डिजाइन द्वारा नहीं, लक्षित मशीन आर्किटेक्चर द्वारा सीमाएं लगाई जा सकती हैं।

ध्यान दें कि ये प्रोग्राम पर लगाए गए ऊपरी सीमाएं हैं। किसी भी सीमित सीमा को लागू करने के लिए एक कंपाइलर की आवश्यकता नहीं होती है। यदि एक कंपाइलर लाइन की लंबाई पर एक सीमा लगाता है, तो यह कम से कम 50 9 या 40 9 5 वर्ण होना चाहिए। (मुझे लगता है कि, अधिकांश वास्तविक कंपाइलर निश्चित सीमा लागू नहीं करते हैं, बल्कि वे गतिशील रूप से स्मृति आवंटित करते हैं।)

+0

हालांकि निश्चित रूप से एक व्यावहारिक सीमा है- यदि संकलक 32-बिट निष्पादन योग्य है, तो यह निश्चित रूप से 4 जी (ऑब्जेक्ट फ़ाइल प्रारूप सीमाओं के बावजूद) स्ट्रिंग अक्षर को संभालने में सक्षम नहीं होगा। पाठ्यक्रम की वास्तविक सीमा बहुत कम होगी। –

+0

प्रारंभिक 'कॉन्स्ट char []' संकलित समय पर भी बनाया गया नहीं है? – npostavs

+0

@npostavs: यह हो सकता है, लेकिन 32767-बाइट सीमा (सी 99 में 65536 तक बढ़ी) रन-टाइम ऑब्जेक्ट्स पर लागू होती है, भले ही वे कैसे बनाए जाते हैं। –

4

ऐसा नहीं है कि 50 9 वर्ण स्ट्रिंग की सीमा है, यह एएनएसआई संगतता के लिए न्यूनतम आवश्यक है, जैसा कि here समझाया गया है।

मुझे लगता है कि मानक निर्माताओं ने अपने गधे से 50 9 नंबर खींच लिया, लेकिन जब तक हमें इससे कुछ आधिकारिक दस्तावेज नहीं मिलते, तो हमें जानने का कोई तरीका नहीं है।

जहां तक ​​वास्तव में स्ट्रिंग अक्षर में कितने वर्ण हो सकते हैं, यह संकलक-निर्भर है।

  • MSVC:: 2048
  • जीसीसी:

    कुछ उदाहरण हैं कोई सीमा (100,000 के लिए वर्ण), लेकिन 510 पात्रों के बाद चेतावनी देता है:

    स्ट्रिंग की लंबाई का शाब्दिक 100000 अधिकतम लंबाई 50 9 से अधिक है कि C90 कंपाइलर्स को

का समर्थन करने की आवश्यकता है
+0

दिलचस्प जानकारी, लेकिन यह वास्तव में सवाल का जवाब नहीं देती है। –

+0

@ किथ थॉम्पसन मैं असहमत हूं। यह सवाल का जवाब देता है कि यह बताता है कि यह 'सीमा' नहीं है, लेकिन 'न्यूनतम' है, इसलिए अधिकांश कंपाइलरों पर, कोई फर्क नहीं पड़ता। –

+0

मुझे लगता है कि मुख्य बिंदु यह है कि मानक में संदर्भित 50 9 न्यूनतम है, अधिकतम नहीं। –

0

देर से उत्तर के बारे में खेद है, लेकिन मैं दो मामलों के बीच अंतर को स्पष्ट करना चाहता हूं (रिचर्ड जे रॉस पहले से ही है कि वे बराबर नहीं कर रहे हैं ने बताया)

मान लीजिए आप इस प्रयास करें:।

const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' }; 
const char* str = __THE_LITERAL; 
char *str_writable = (char *) str; // Not so const anymore 
str_writable[0] = 'g'; 

अब str "goo" में शामिल है।

लेकिन आप ऐसा करते हैं, तो:

const char* str = "foo"; 
char *str_writable = (char *) str; 
str_writable[0] = 'g'; 

परिणाम: segfault! (मेरे मंच पर, कम से कम।)

यहां मौलिक अंतर है: पहले मामले में आपके पास एक सरणी है जिसे "foo" में प्रारंभ किया गया है, लेकिन दूसरे मामले में आपके पास वास्तविक स्ट्रिंग अक्षर है।

एक तरफ ध्यान दें पर,

const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' }; 

बिल्कुल

const char __THE_LITERAL[] = "foo"; 

यहाँ = एक सरणी प्रारंभकर्ता के रूप में करने के बजाय काम के रूप में कार्य करने के लिए बराबर है। यह

const char *str = "foo"; 

जहां स्ट्रिंग शाब्दिक का पता str को सौंपा गया है से बहुत अलग है।

+0

ओह, मेरा मतलब __THE_LITERAL के लिए स्थिर चर होने के लिए था, इस मामले में दोनों मामलों में segfault परिणाम। – npostavs

+0

@npostavs: हम्म, आप सही हैं। दिलचस्प। असल में मुझे '=" foo "के बारे में गलत बताया गया था, जिसका इलाज ठीक से' = {'f', 'o', 'o', '\ 0'} 'के रूप में किया जा रहा था। यदि मैं 50 9 से अधिक वर्णों का उपयोग करके वही काम करता हूं, तो जीसीसी पहले मामले में चेतावनी देता है लेकिन दूसरा नहीं। मुझे लगता है कि यह किथ थॉम्पसन ने ऊपर क्या कहा है - कंपेलर प्रसंस्करण के लिए निश्चित आकार डेटा संरचनाओं का उपयोग कर सकते हैं। –

संबंधित मुद्दे