int (*)[]
एक अपूर्ण प्रकार हो सकता है?
सी 2018 6.2.5 1 कहता है:
अनुवाद इकाई के भीतर विभिन्न बिंदुओं पर एक वस्तु प्रकार अपूर्ण हो सकता है (उस प्रकार की वस्तुओं के आकार को निर्धारित करने के लिए पर्याप्त जानकारी का अभाव) या पूर्ण (पर्याप्त जानकारी होना)।
इस प्रकार ऐसा लगता है कि यदि किसी प्रकार का आकार ज्ञात है, तो प्रकार पूर्ण है। 6.2.6.1 28 निर्दिष्ट करता है कि कुछ प्रकार के पॉइंटर्स में एक ही आकार (पॉइंटर्स टू void
और कैरेक्टर, पॉइंटर्स टू कम्पेटिटिव टाइप, पॉइंटर्स टू स्ट्रक्चर, और पॉइंटर्स टू यूनियंस) होना चाहिए, लेकिन पॉइंटर्स अन्य प्रकारों में भिन्न हो सकते हैं।
एक सी कार्यान्वयन में जहां सभी बिंदुओं, या सभी बिंदुओं को सरणियों में int
, एक ही आकार है, फिर आकार int (*)[]
ज्ञात है, इसलिए यह पूर्ण होगा। एक कार्यान्वयन में, जो कहता है, बड़े सरणियों के लिए विभिन्न बिंदुओं का उपयोग करता है, आकार ज्ञात नहीं होगा, इसलिए यह अपूर्ण है।
जैसा कि एमएम बताते हैं , किसी संरचना में अपूर्ण प्रकार के सदस्य नहीं होने चाहिए, एक अंतिम लचीले सरणी सदस्य को छोड़कर, 6.7.2.1 में एक बाधा के अनुसार। 3. यह बताता है कि एक आकार के पॉइंटर्स के साथ एक कार्यान्वयन को स्वीकार करना चाहिए, struct { int (*p)[]; }
जबकि एक कार्यान्वयन जो अलग है इस तरह के सरणियों के लिए आकार एक बाधा उल्लंघन का निदान करना चाहिए। (यह बदले में इस तरह की घोषणा का कड़ाई से अनुरूप सी का हिस्सा नहीं है)
void *
पूरा होने वाला तथ्य यह दर्शाता है कि एक अपूर्ण प्रकार का सूचक पूरा हो सकता है। यह नहीं दिखाता है कि अपूर्ण प्रकार के लिए सूचक अपूर्ण हो सकता है या नहीं। यदि कोई पूछे कि "क्या एक स्तनपायी हाथी हो सकता है?", तो यह दर्शाता है कि "एक शेर एक स्तनपायी है" यह प्रदान नहीं करेगा कि एक स्तनपायी हाथी नहीं हो सकता है। सवाल पूछता है कि क्या अपूर्ण प्रकार के संकेत के सेट X में एक तत्व हो सकता है जो अपूर्ण है। यह दर्शाता है कि अपूर्ण प्रकार के संकेत के सेट X में एक ऐसा तत्व होता है जो पूर्ण होता है अप्रासंगिक।