2011-09-09 4 views
6

निम्नलिखित स्निपेट पर विचार करें:sizeof() की संरचना करने के लिए लागू किया और चर

struct foo { 
    int a; 
    int b; 
    int c; 
}; 

struct foo f; 
printf("%u, %u\n", sizeof(struct foo), sizeof(f)); 

कोड वापस लौटा ही मान, लेकिन मैं अगर sizeof() अलग-अलग करने के लिए लागू सही है या यह सिर्फ संयोग है सोच रहा था?

धन्यवाद।

+0

क्या आपने गुगलिंग "आकार पर लागू आकार" का प्रयास किया था? पहले दो परिणाम (जिनमें से एक स्टैक ओवरफ्लो से है) आपके प्रश्न का उत्तर देने में सक्षम होंगे। –

+0

हां, दोनों 'आकार' अभिव्यक्तियां समान मान लौटाती हैं। ध्यान दें कि दूसरे को कोष्ठक की आवश्यकता नहीं है; 'sizeof' एक ऑपरेटर है, फ़ंक्शन नहीं। लेकिन '% u' को 'unsigned int' प्रकार का तर्क चाहिए, न कि 'size_t'। इसे लिखें: 'printf ("% zu% zu \ n", sizeof (struct foo), आकार का f); 'या यह:' printf ("% lu% lu \ n", (हस्ताक्षरित लंबा) आकार (संरचना foo) , (हस्ताक्षर किए गए लंबे) आकार एफ); '। '% zu' एक सी 99-विशिष्ट सुविधा है; आपके सिस्टम का 'printf' mignt इसका समर्थन नहीं करता है। –

उत्तर

6

दोनों ही वही मूल्य वापस कर देंगे और चाहिए।

MSDN से:

sizeof ऑपरेटर
sizeof ऑपरेटर संग्रहण की मात्रा, बाइट में, संकार्य के प्रकार की एक वस्तु की दुकान करने के लिए आवश्यक देता है। यह ऑपरेटर आपको अपने कार्यक्रमों में मशीन-निर्भर डेटा आकार निर्दिष्ट करने से बचने की अनुमति देता है।

sizeof unary-expression 
sizeof (type-name) 
1

यह अपेक्षा की जाती है, यानी दोनों एक ही मूल्य वापस कर देंगे। यह मान संकलन-समय पर गणना की जाती है।

आमतौर पर sizeof में चर का उपयोग करने के लिए यह एक अच्छा अभ्यास है क्योंकि आप बाद में प्रकार बदल सकते हैं और इस प्रकार आकार भी बदल सकता है।

0

सामान्यतः इसे चर पर लागू करना बेहतर है। वैरिएबल के प्रकार में परिवर्तन होने पर यह सही रहेगा।

+0

इस तरह का नुकसान यह है कि यदि आप चर के प्रकार को "बस संरचना" से "पॉइंटर टू स्ट्रक्चर" में बदलते हैं, तो आकार (चर) 4 (या 8 आर्किटेक्चर के आधार पर) बन जाएगा और संकलक खुशी से इसे किसी भी बताए बिना स्वीकार करेगा चेतावनी। – ivanzoid

5

sizeofप्रकार और भाव साथ काम करता है। जब आप इसे किसी प्रकार पर लागू करते हैं, तो ()sizeof सिंटैक्स का हिस्सा हैं: sizeof(type)। जब आप इसे अभिव्यक्ति पर लागू करते हैं ()sizeof वाक्यविन्यास का हिस्सा नहीं हैं: sizeof expression

तो आपका दूसरा sizeof वास्तव में "एक चर पर लागू नहीं है"। यह (f) अभिव्यक्ति पर लागू होता है। उस अभिव्यक्ति में की एक अनावश्यक जोड़ी में संलग्न एकल चर f शामिल है। आप () की उस अनावश्यक जोड़ी के बिना भी कर सकते हैं और केवल sizeof f का उपयोग कर सकते हैं।

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

वास्तव में, एक अच्छा प्रोग्रामिंग अभ्यास sizeof(type) से जितना संभव हो सके से बचने के लिए है, यानी sizeof expression का उपयोग करना पसंद करते हैं। यह आपके कोड को अधिक प्रकार-स्वतंत्र बनाता है, जो हमेशा एक अच्छी बात है। टाइप नाम घोषणाओं में हैं और कहीं और नहीं।

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

  • कोई संबंधित समस्या नहीं^_^