2012-06-10 10 views
12

मैंने देखा कि जब GCC 4.6 sizeof(Foo) के साथ संकलित किया गया है 0 और sizeof(Bar) 1 है। किसी कारण से खाली संरचना में खाली सरणी जोड़ने से उसका आकार 0 बना। मैंने सोचा कि दोनों संरचनाओं के आकार समान होना चाहिए । यहाँ क्या हो रहा है?शून्य आकार संरचना

struct Foo 
{ 
    char x[]; 
}; 

struct Bar {}; 
+1

यह अजीब है, 'आकार' कभी भी _0 _... –

+0

@ के-बॉलो नहीं हो सकता है: 'char x []' आकार जैसे लचीले सरणी के लिए 0. – Tudor

+0

@ ट्यूडर: लचीला सरणी, क्या यह एक कंपाइलर एक्सटेंशन है? –

उत्तर

16

न तो struct घोषणा सी मानक द्वारा अनुमति दी है। 6.7.2.1 (8) n1570 में:

If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined.

और एक ही अनुभाग में पैरा 18:

As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. In most situations, the flexible array member is ignored. In particular, the size of the structure is as if the flexible array member were omitted except that it may have more trailing padding than the omission would imply.

(जोर मेरा)

लचीले सरणी सदस्यों C++ की अनुमति नहीं है, इसलिए कोड या तो मान्य सी ++ मान्य नहीं है।

चूंकि यह वैध कोड नहीं है, इसलिए sizeof द्वारा रिपोर्ट किए गए मान व्यर्थ हैं।

1

आकार का ऑपरेटर कभी भी खाली कक्षा के लिए 0 उत्पन्न नहीं करता है।

के रूप में आप देख सकते हैं here on msdn

इसके अलावा MSDN बताते हुए है:

sizeof ऑपरेटर निम्नलिखित ऑपरेंड के साथ नहीं किया जा सकता:

  • कार्य। (हालांकि, आकार को पॉइंटर्स पर फ़ंक्शंस पर लागू किया जा सकता है।)
  • बिट फ़ील्ड।
  • अपरिभाषित कक्षाएं।
  • प्रकार शून्य।
  • गतिशील आवंटित सरणी।
  • बाहरी सरणी।
  • अपूर्ण प्रकार।
  • अपूर्ण प्रकार के अभिभावक नाम।
1

सी और सी ++ शून्य आकार वाली वस्तुओं की अनुमति नहीं देते हैं।

जीसीसी उन्हें को एक्सटेंशन के रूप में समर्थन देता है। यदि आप उचित विकल्पों के साथ संकलित करते हैं, जैसे कि

gcc -std=c99 -pedantic -Wall -Wextra 

gcc कम से कम आपको उनके बारे में चेतावनी देगा; जी ++ में समान विकल्प हैं।

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