जब हम किसी फ़ंक्शन का उपयोग करके जांच करते हैं sizeof()
, तो हमें हमेशा 1 बाइट मिलता है । यह 1 बाइट क्या दर्शाता है?
जब हम किसी फ़ंक्शन का उपयोग करके जांच करते हैं sizeof()
, तो हमें हमेशा 1 बाइट मिलता है । यह 1 बाइट क्या दर्शाता है?
जवाबों:
यह एक बाधा का उल्लंघन है, और आपके संकलक को इसका निदान करना चाहिए । यदि यह इसके बावजूद इसे संकलित करता है, तो आपके कार्यक्रम में अपरिभाषित व्यवहार है [विफलता मोड के स्पष्टीकरण के लिए @Steve Jessop का धन्यवाद, और कुछ कंपाइलर इसकी अनुमति क्यों देते हैं, इसके लिए @Michael Burr का उत्तर देखें : C11, 6.5.3.4./ 1:
sizeof
ऑपरेटर एक अभिव्यक्ति समारोह प्रकार है कि करने के लिए लागू नहीं किया जाएगा
-std=c11
, नहीं gnu11
। यह वास्तव में अजीब संकलक विस्तार है।
sizeof(void)
जीएनयू सी में 1 है
-std=c11
: किसी -std=c*
को विज्ञापन मानकों के विकल्पों का उल्लेख करना चाहिए । वे अनुरूपता मोड को सक्षम नहीं करते हैं, वे केवल एक्सटेंशन को अक्षम करते हैं जो एक अच्छी तरह से गठित प्रोग्राम को संकलित करने से रोकते हैं (जैसे कि typeof
एक कीवर्ड के रूप में, चूंकि एक अच्छी तरह से गठित सी प्रोग्राम इसे एक चर नाम के रूप में उपयोग कर सकता है, लेकिन gcc
डिफ़ॉल्ट रूप से इसे अस्वीकार कर देगा )। अतिरिक्त रूप से अक्षम किए गए एक्सटेंशनों को अक्षम करने के लिए जो अन-बन चुके प्रोग्रामों को अपरिवर्तित पास करने की अनुमति देते हैं, आपको आवश्यकता है -pedantic
या -pedantic-errors
।
यह अपरिभाषित व्यवहार नहीं है - sizeof
ऑपरेटर के लिए एक बाधा उल्लंघन के बाद से सी भाषा मानक को एक फ़ंक्शन डिज़ाइनर (एक फ़ंक्शन नाम) के साथ ऑपरेटर का उपयोग करते समय एक निदान की आवश्यकता होती है sizeof
।
हालांकि, सी भाषा के विस्तार के रूप में, जीसीसी void
पॉइंटर्स और फ़ंक्शन पॉइंटर्स पर अंकगणित की अनुमति देता है , जो कि void
या किसी फ़ंक्शन के आकार का इलाज करके किया जाता है 1
। परिणामस्वरूप, sizeof
ऑपरेटर के लिए मूल्यांकन करेंगे 1
के लिए void
जीसीसी के साथ एक समारोह या। Http://gcc.gnu.org/onbuildocs/gcc/Pointer-Arith.html#Pointer-Arith देखें
आप sizeof
इन परिचालकों के साथ -pedantic
या का उपयोग करते समय चेतावनी जारी करने के लिए GCC प्राप्त कर सकते हैं-Wpointer-arith
जीसीसी के विकल्पों विकल्पों । या इसके साथ त्रुटि करें -Werror=pointer-arith
।
sizeof
एक फ़ंक्शन यूबी नहीं है (जिसका मैंने केवल बहुत अधिक उल्लेख किया क्योंकि अन्य उत्तर में कहा गया था कि यह यूबी है)। लेकिन शायद मैंने इस बात को गलत समझा कि जिस तरह से मैंने वाक्य को संरचित किया था। अधिक स्पष्ट होना। sizeof
एक फ़ंक्शन यूबी नहीं है (जैसा कि कई उत्तरों ने दावा किया है)। यह एक बाधा का उल्लंघन है। जैसे, यह एक निदान की आवश्यकता है। जीसीसी इसे एक विस्तार के रूप में अनुमति देता है।
यह दर्शाता है कि संकलक लेखक ने आपकी नाक से राक्षसों को उड़ने के बजाय 1 के मूल्य पर फैसला किया (वास्तव में, यह इसका एक और अपरिभाषित उपयोग था sizeof
जिसने हमें यह अभिव्यक्ति दी: "सी संकलक खुद एक निदान जारी करना आवश्यक है, अगर यह पहली आवश्यकता है) डायग्नोस्टिक आपके प्रोग्राम के परिणामस्वरूप, और फिर MAY खुद राक्षसों को आपकी नाक से उड़ान भरने का कारण बनता है (जो, वैसे, प्रलेखित डायग्नोस्टिक संदेश को अच्छी तरह से बीई कर सकता है) क्योंकि यह सिंटैक्स नियमों या बाधाओं के आगे के उल्लंघन के लिए डायग्नोस्टिक जारी करता है (या,) उस मामले के लिए, किसी भी कारण से यह चुनता है)। " https://groups.google.com/forum/?fromgroups=#=msg/comp.std.c/ycpVKxTZkgw/S2hHdTbvd8d8J
इससे एक अनिर्णीत निर्माण के जवाब में संकलक जो भी करने का फैसला करता है, उसके लिए "नक्सल दानव" है। 1
इस मामले के लिए इस संकलक का नाक दानव है।
जैसा कि अन्य ने बताया है, sizeof () कोई भी वैध पहचानकर्ता ले सकता है, लेकिन यह फ़ंक्शन नामों के लिए एक वैध (एक ईमानदारी से सच और वैध) परिणाम नहीं लौटाएगा। इसके अलावा, यह निश्चित रूप से हो सकता है, या "राक्षसों के नाक से बाहर" सिंड्रोम के परिणामस्वरूप हो सकता है।
यदि आप अपने प्रोग्राम फंक्शन साइज़ को प्रोफाइल करना चाहते हैं, तो लिंकर मैप को देखें, जो कि इंटरमीडिएट रिजल्ट डायरेक्टरी पर पाया जा सकता है। कभी-कभी इस मैप फ़ाइल को जेनरेट करने या न करने का विकल्प होता है ... यह कंपाइलर / लिंकर पर निर्भर है।
यदि आप किसी फ़ंक्शन के लिए पॉइंटर का आकार चाहते हैं, तो वे सभी समान आकार हैं, आपके सीपीयू पर एक संबोधित शब्द का आकार।
int x = 1;
लेकिन उनमें से केवल एक मानकों के अनुरूप संकलक के लिए अनुमति है। sizeof()
किसी फ़ंक्शन पर लागू होने के साथ , यह एक निर्धारित मान वापस नहीं कर सकता है, या उस समय एक विशेष रजिस्टर में जो कुछ भी है, उसके आधार पर एक यादृच्छिक मूल्य को संकलित करने या वापस करने से इनकार कर सकता है। शाब्दिक नाक राक्षसों की संभावना नहीं है, लेकिन मानक के पत्र के भीतर।
sizeof
करें।
-pedantic
), तो आपके पास एक गैर-संकलित कंपाइलर है और हर प्रोग्राम में अपरिभाषित व्यवहार होता है।