2012-05-11 20 views
10

संभव डुप्लिकेट:
What is the size of void?आकार (शून्य) == 1 क्यों है?

§6.2.5.19 में, भविष्यद्वक्ताओं हमें यह बताने:

void प्रकार मान

के एक खाली सेट निहित होता है

n sizeof(void) उपज 1 क्यों होता है, जब 0 पर्याप्त लगता है?

+0

http://stackoverflow.com/questions/1666224/what-is-the-size-of-void –

+0

इस प्रश्न और उसके पुराने डुप्लिकेट के बीच एक अंतर है: यह एक है स्वीकृत उत्तर में एसी शामिल है दोहरी सबूत – Philip

+0

http://meta.stackexchange.com/questions/32311/do-not-delete-duplicates – Flexo

उत्तर

10

sizeof(void) एक सी संकलक पर संकलन नहीं होंगे।

आईएसओ 98 99: 2011 6.2।5/19

"शून्य प्रकार में मूल्यों का एक खाली सेट शामिल है; यह एक अपूर्ण ऑब्जेक्ट प्रकार है जिसे पूरा नहीं किया जा सकता है।"

आईएसओ 9899: 2011 6.5.3.4/1

"sizeof ऑपरेटर एक अभिव्यक्ति समारोह प्रकार या एक अधूरा प्रकार है कि करने के लिए लागू नहीं किया जाएगा"

यह प्रामाणिक पाठ है : आकार (शून्य) वैध सी नहीं है

+0

... और फिर भी यह जीसीसी के साथ संकलित करता है, क्योंकि यह एक जीसीसी एक्सटेंशन है। http देखें : //gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith – Philip

+4

मुझे आश्चर्य है कि यह ओपी के प्रश्न का उत्तर कैसे देता है ... – ThiefMaster

+0

@ फिलिप हां वास्तव में, लेकिन यह होगा एक सी कंपाइलर के एक अनुरूप कार्यान्वयन पर संकलित नहीं। – Lundin

19

यह एक जीसीसी विस्तार है: http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith

GNU सी में, जोड़ और घटाव के संचालन void की ओर इशारा पर और कार्यों के लिए संकेत पर समर्थित हैं। यह एक void के आकार के इलाज के द्वारा या के रूप में 1.

इस का एक परिणाम यह है कि sizeof भी void पर और समारोह प्रकार पर अनुमति दी है, और रिटर्न 1.

विकल्प -Wpointer-arith अनुरोध है एक समारोह के लिए किया जाता है अगर इन एक्सटेंशन का उपयोग किया जाता है तो एक चेतावनी। और एक तत्व के आकार की ओर इशारा किया -

कारण है कि void एक आकार की जरूरत है इस तरह के arithmetics प्रदर्शन करने के लिए है कि ptr - ptr2 वास्तव में ऐसा नहीं करता आप पतों की संख्यात्मक अंतर लेकिन तत्वों की संख्या दो संकेत अलग कर रहे हैं देता है void *ptrsizeof(*ptr) है जो sizeof(void) है।

+0

यदि यह एक एक्सटेंशन है, तो 'gcc -std = c99 -pedantic' आकार (शून्य) == 1 क्यों देता है? -पैडेंटिक एक शून्य प्रकार के आकार का उपयोग करने के लिए एक चेतावनी देता है, लेकिन कोड संकलित करता है और प्रिंट करता है 1. – Lundin

+3

@ लुंडिन: क्योंकि आपने '-pedantic' का उपयोग किया था, न कि '-pedantic-त्रुटियों' – Christoph

+1

@ क्रिस्टोफ मेरी राय में, यह होना चाहिए -std = c99 ध्वज सेट करने के लिए पर्याप्त है और फिर इसे कोड को त्रुटियों के बिना संकलित करने की अनुमति भी नहीं देनी चाहिए। – Lundin

7

आप शायद जीसीसी, या कुछ अन्य कंपाइलर का उपयोग कर रहे हैं जो इसे एक एक्सटेंशन के रूप में करता है (सी, आकार (शून्य) में मान्य नहीं है)।

जीसीसी का कहना है:

GNU सी में, जोड़ और घटाव के संचालन संकेत शून्य करने के बारे में और कार्यों के लिए संकेत पर समर्थित हैं। यह एक शून्य की आकार के इलाज के द्वारा या के रूप में 1.

एक समारोह इस का एक परिणाम यह है कि sizeof भी शून्य पर और समारोह प्रकार पर अनुमति दी है, और रिटर्न 1.

विकल्प है के लिए किया जाता है -Ppointer-arith एक चेतावनी का अनुरोध करता है यदि ये एक्सटेंशन उपयोग किए गए हैं।

+1

... और यह §6.5.3.4.1 की वजह से अमान्य है: "आकार का ऑपरेटर उस अभिव्यक्ति पर लागू नहीं किया जाएगा जिसमें फ़ंक्शन प्रकार या अधूरा प्रकार है, इस प्रकार के संश्लेषित नाम पर, या एक अभिव्यक्ति जो बिट-फील्ड सदस्य को निर्दिष्ट करती है "और §6.2.5.19:" 'शून्य 'एक" अपूर्ण प्रकार है जिसे पूरा नहीं किया जा सकता है। " – Philip

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