स्थैतिक भंडारण अवधि वाले सभी चरों को उनके संबंधित शून्य मानों में अंतर्निहित होने की गारंटी दी जाती है, जिसका आमतौर पर यह मतलब नहीं है कि उन्हें शारीरिक रूप से सभी बिट्स-शून्य पैटर्न से भरा होना चाहिए।
इस तरह के चर कुछ विशिष्ट प्लेटफॉर्म पर बीएसएस सेगमेंट पर जा सकते हैं यह है कि लक्षित प्लेटफ़ॉर्म पर शून्य सूचक वास्तव में सभी बिट्स-शून्य पैटर्न द्वारा दर्शाया जाता है। अर्थात। पॉइंटर्स के लिए ऑल-बिट्स-शून्य प्रारंभिकता केवल उस प्लेटफ़ॉर्म पर सही ढंग से काम करने के लिए होती है, इसलिए संकलक उस विशिष्ट प्लेटफ़ॉर्म पर सही व्यवहार को लागू करने के लिए सबसे सरल और सबसे प्रभावी तरीका के रूप में बीएसएस का उपयोग करता है। यदि यह मामला नहीं था, तो संकलक को इस तरह के स्थैतिक चर को अलग-अलग शुरू करना होगा।
यह फ़्लोटिंग-पॉइंट मानों पर लागू होगा, उदाहरण के लिए, यदि कुछ प्लेटफॉर्म 0.0
(सी को आईईईई 754 को जरूरी नहीं है) के प्रतिनिधित्व के लिए गैर-शून्य बिट पैटर्न वाले गैर मानों के लिए गैर-आईईईई 754 प्रतिनिधित्व का उपयोग किया जाता है।
(इसके अलावा, यह char
से बड़े सभी अभिन्न प्रकारों पर भी लागू होता है, जब तक कि सी 99 मानक के लिए टीसी में से एक को अंततः सभी प्रकार के पूर्णांक शून्य के लिए एक वैध ऑब्जेक्ट प्रतिनिधित्व के लिए सभी बिट्स-शून्य पैटर्न की आवश्यकता नहीं होती सी प्लेटफार्म।)
एक अच्छा असली जीवन उदाहरण सी ++ (एक अलग भाषा लेकिन इस मामले में प्रासंगिक) से आता है। सी ++ स्थिर भंडारण अवधि के साथ स्केलर चर के लिए एक ही गारंटी देता है। इस बीच, कई लोकप्रिय सी ++ कार्यान्वयन 0xFFFFFFFF
मान का उपयोग पॉइंटर-टू-डेटा-सदस्य प्रकार के नल पॉइंटर्स का प्रतिनिधित्व करने के लिए करते हैं। जैसे
SomeType SomeClass::*p = 0;
वास्तव में कोड है कि सभी बिट-एक पैटर्न के साथ p
भरता में तब्दील हो। इसलिए, यदि आप एक स्पष्ट प्रारंभकर्ता के बिना इस प्रकार के स्थिर चर घोषित करते हैं, तो संकलक को यह सुनिश्चित करना होगा कि उसका प्रारंभिक मान सभी बिट्स-एक पैटर्न है, न कि सभी बिट्स-शून्य पैटर्न। कुछ कंपाइलर्स बीएसएस में ऐसे चर डालने से गलत होने के लिए जाने जाते हैं, उनके बारे में भूल रहे हैं, इस प्रकार सभी बिट्स-शून्य पैटर्न से भरे ऐसे चर छोड़ रहे हैं।
यहां कुछ अच्छी जानकारी दी गई है: http://en.cppreference.com/w/cpp/language/zero_initialization –
यह 'p'' के मूल्य के बारे में कोई टिप्पणी नहीं है। यह एक कोडिंग शैली विचार है। जब आप 'int * p' का उपयोग करते हैं, तो यह प्रारंभ करने के लिए प्रारंभ करने की आवश्यकता पर बल देने में विफल रहता है। यह सुझाव देता है कि प्रारंभिक मूल्य एक देखभाल नहीं है, भले ही इसे 'सी' द्वारा' NULL' में प्रारंभ किया गया हो। 'int * p = NULL; 'उस प्रारंभिकरण के लिए प्रोग्राम _needs_ का तात्पर्य है। यही अंतर मैं देखता हूं। – chux