आकार जो अभिव्यक्ति के प्रकार को देखता है, यह अभिव्यक्ति का मूल्यांकन नहीं करता है। इस प्रकार, आपको केवल यह सुनिश्चित करने की आवश्यकता है कि अभिव्यक्ति में उपयोग किए गए चर घोषित किए गए हैं ताकि संकलक उनके प्रकार को कम कर सके।
आपके उदाहरण में, सेंट को पहले ही पॉइंटर-टू-स्ट्रक्चर-रेटवैल्यू के रूप में घोषित किया गया है। नतीजतन संकलक "* सेंट" अभिव्यक्ति के प्रकार को कम करने में सक्षम है।
हालांकि ऐसा लगता है कि यह आपके कोड में पहले ही घोषित नहीं है, संकलक पहले से ही आपके लिए इसका ख्याल रख चुका है। आपके कोड में सभी घोषणाओं को ब्लॉक की शुरुआत में स्थानांतरित किया जाता है जिसमें वे कंपाइलर द्वारा होते हैं। मान लीजिए कि आप
संकलक के लिए उपलब्ध ज्ञान को चित्रित करने का एक तरीका यह है कि यह उत्पन्न होने वाले मध्यवर्ती आउटपुट को देखना है। इस उदाहरण कोड पर विचार करें ...
struct retValue {long int a, long int b};
...
printf("Hello World!\n");
struct retValue* st = malloc(sizeof(*st));
एक उदाहरण के रूप जीसीसी और मुख्य()test.c के समारोह में तेह उपरोक्त कोड का उपयोग करना, की चलाकर मध्यवर्ती उत्पादन को देखो ...
gcc -fdump-tree-cfg test.c
संकलक फ़ाइल उत्पन्न होगा test.c.022t.cfg - इसे देखो और आप देखेंगे
[ ... removed internal stuff ...]
;; Function main (main)
Merging blocks 2 and 3
main (argc, argv)
{
struct retValue * st;
int D.3097;
void * D.3096;
# BLOCK 2
# PRED: ENTRY (fallthru)
__builtin_puts (&"Hello World!"[0]);
D.3096 = malloc (16);
st = (struct retValue *) D.3096;
D.3097 = 0;
return D.3097;
# SUCC: EXIT
}
नोट करें कि घोषणा को ब्लॉक की शुरुआत में कैसे स्थानांतरित किया गया था और मॉलोक के लिए तर्क पहले ही वास्तविक मूल्य के साथ प्रतिस्थापित किया गया है जिस प्रकार अभिव्यक्ति का मूल्यांकन किया गया है। जैसा कि टिप्पणियों में बताया गया है, तथ्य यह है कि घोषणा ब्लॉक के शीर्ष पर ले जाया गया था संकलक का कार्यान्वयन विवरण है। हालांकि, तथ्य यह है कि संकलक ऐसा करने में सक्षम है और मॉलोक में सही आकार डालने के लिए सभी दिखाता है कि संकलक इनपुट से आवश्यक जानकारी को कम करने में सक्षम था।
मैं व्यक्तिगत रूप से आकार के पैरामीटर के रूप में वास्तविक प्रकार का नाम देना पसंद करता हूं, लेकिन शायद यह कोडिंग-शैली का सवाल है जहां मैं कहूंगा कि स्थिरता व्यक्तिगत प्राथमिकता को रोकती है।
आपने अपने प्रश्न का उत्तर दिया। आकार (संरचना retValue) सही है –
क्षमा करें, सवाल यह नहीं था कि 'क्या यह सही है, या सही क्या है?' यह 'यह क्यों काम करता है?' – Blackbinary
यदि आप शब्दावली को बदलते हैं तो यह समझने में सहायता कर सकता है। आप malloc का उपयोग कर * एक संरचना * परिभाषित नहीं कर रहे हैं, आप * malloc का उपयोग कर * एक संरचना * आवंटित कर रहे हैं। आप 'st' को परिभाषित कर रहे हैं, जो एक सूचक (संरचना नहीं है) है। वह पॉइंटर पहले से परिभाषित है और प्रारंभिक अभिव्यक्ति (बराबर चिह्न के आरएचएस पर) में उपयोग के लिए उपलब्ध है, इसका मूल्य नहीं है, इसलिए अधिकांश उपयोग अमान्य होंगे। यह ठीक है, हालांकि, क्योंकि आकार मूल्य का उपयोग नहीं करता है। –