क्या एक अपूर्ण प्रकार का सूचक अधूरा हो सकता है?


9

int (*)[]एक अपूर्ण प्रकार हो सकता है?

सी 2018 6.2.5 1 कहता है:

अनुवाद इकाई के भीतर विभिन्न बिंदुओं पर एक वस्तु प्रकार अपूर्ण हो सकता है (उस प्रकार की वस्तुओं के आकार को निर्धारित करने के लिए पर्याप्त जानकारी का अभाव) या पूर्ण (पर्याप्त जानकारी होना)।

इस प्रकार ऐसा लगता है कि यदि किसी प्रकार का आकार ज्ञात है, तो प्रकार पूर्ण है। 6.2.6.1 28 निर्दिष्ट करता है कि कुछ प्रकार के पॉइंटर्स में एक ही आकार (पॉइंटर्स टू voidऔर कैरेक्टर, पॉइंटर्स टू कम्पेटिटिव टाइप, पॉइंटर्स टू स्ट्रक्चर, और पॉइंटर्स टू यूनियंस) होना चाहिए, लेकिन पॉइंटर्स अन्य प्रकारों में भिन्न हो सकते हैं।

एक सी कार्यान्वयन में जहां सभी बिंदुओं, या सभी बिंदुओं को सरणियों में int, एक ही आकार है, फिर आकार int (*)[]ज्ञात है, इसलिए यह पूर्ण होगा। एक कार्यान्वयन में, जो कहता है, बड़े सरणियों के लिए विभिन्न बिंदुओं का उपयोग करता है, आकार ज्ञात नहीं होगा, इसलिए यह अपूर्ण है।

जैसा कि एमएम बताते हैं , किसी संरचना में अपूर्ण प्रकार के सदस्य नहीं होने चाहिए, एक अंतिम लचीले सरणी सदस्य को छोड़कर, 6.7.2.1 में एक बाधा के अनुसार। 3. यह बताता है कि एक आकार के पॉइंटर्स के साथ एक कार्यान्वयन को स्वीकार करना चाहिए, struct { int (*p)[]; }जबकि एक कार्यान्वयन जो अलग है इस तरह के सरणियों के लिए आकार एक बाधा उल्लंघन का निदान करना चाहिए। (यह बदले में इस तरह की घोषणा का कड़ाई से अनुरूप सी का हिस्सा नहीं है)


6.2.5 (पी 22) मदद? (या यह अधूरा प्रकार को बाद में घोषणा द्वारा पूरा करने की अनुमति देता है और भ्रम को जोड़ता है?)
डेविड सी। रैनकिन

@ DavidC.Rankin 6.2.5 / 20 में यह भी कहा गया है कि संकेत हमेशा पूर्ण प्रकार होते हैं
क्रिस्टोफ

@LanguageLawyer: यह कैसे प्रासंगिक होगा? सवाल यह है कि "क्या कोई ऐसा एक्स है जो वाई नहीं है?", "नहीं एक एक्स है जो वाई है?"
एरिक पोस्टपिसिल

@LanguageLawyer: void *पूरा होने वाला तथ्य यह दर्शाता है कि एक अपूर्ण प्रकार का सूचक पूरा हो सकता है। यह नहीं दिखाता है कि अपूर्ण प्रकार के लिए सूचक अपूर्ण हो सकता है या नहीं। यदि कोई पूछे कि "क्या एक स्तनपायी हाथी हो सकता है?", तो यह दर्शाता है कि "एक शेर एक स्तनपायी है" यह प्रदान नहीं करेगा कि एक स्तनपायी हाथी नहीं हो सकता है। सवाल पूछता है कि क्या अपूर्ण प्रकार के संकेत के सेट X में एक तत्व हो सकता है जो अपूर्ण है। यह दर्शाता है कि अपूर्ण प्रकार के संकेत के सेट X में एक ऐसा तत्व होता है जो पूर्ण होता है अप्रासंगिक।
एरिक पोस्टपिसिल

@EricPostpischil उफ़। मैंने शीर्षक गलत लिखा है "क्या एक अपूर्ण प्रकार का सूचक पूर्ण हो सकता है ?"
भाषा वकील

जवाबों:


3

अज्ञात आकार की एक सारणी अपूर्ण है:

अज्ञात प्रकार का एक सरणी प्रकार एक अपूर्ण प्रकार है। यह उस प्रकार के पहचानकर्ता के लिए, बाद के घोषणा में आकार निर्दिष्ट करके (आंतरिक या बाहरी संबंध के साथ) पूरा हो गया है।

int (*)[]हालांकि यह प्रकार अधूरा नहीं है: यह intअज्ञात आकार की एक सरणी का एक संकेतक है ।
और एक पॉइंटर का एक जाना-माना आकार है:

printf ("Size %d\n", sizeof(int (*)[]));

6.2.5 / 23: एक प्रकार ने निरंतर आकार ज्ञात किया है यदि प्रकार अपूर्ण नहीं है और एक चर लंबाई सरणी प्रकार नहीं है।

इसके अलावा आप इसे भी संक्षिप्त कर सकते हैं, सरणी शब्दार्थ के लिए धन्यवाद:

typedef int (*T)[];
...
int a[10];
for (int i=0; i<10; i++) a[i]=i;
T p=a;
for (int i=0; i<10; i++) printf ("%d ",(*p)[i]);
printf ("\n");

संपादित करें

इसके अलावा, एक सूचक हमेशा एक पूर्ण प्रकार होता है। यह सफेद पर काले रंग में 6.2.5 / 20 लिखा है:

एक पॉइंटर प्रकार को फ़ंक्शन प्रकार या ऑब्जेक्ट प्रकार से प्राप्त किया जा सकता है, जिसे संदर्भित प्रकार कहा जाता है। एक पॉइंटर प्रकार किसी ऑब्जेक्ट का वर्णन करता है जिसका मान संदर्भित प्रकार की एक इकाई को एक संदर्भ प्रदान करता है। संदर्भित प्रकार T से प्राप्त एक पॉइंटर प्रकार को कभी-कभी 'पॉइंटर टू टी' कहा जाता है। संदर्भित प्रकार से सूचक प्रकार के निर्माण को '' सूचक प्रकार व्युत्पत्ति '' कहा जाता है। एक सूचक प्रकार एक पूर्ण वस्तु प्रकार है।


मुझे लगता है कि आप इसे उबला हुआ है और जीसीसी सहमत हैं। अधूरा सरणी के लिए संरचना w / सूचक मूल प्रश्न पर चर्चा करने के लिए समान है।
डेविड सी। रंकिन

केवल अंतिम पैराग्राफ प्रासंगिक है। printfकेवल उदाहरण से पता चलता है कि अपूर्ण सरणी के लिए एक संकेतक उस क्रियान्वयन में पूरा हो गया है, जिसमें इसे निष्पादित किया गया था, जैसा कि प्रश्न में कहा गया है - यदि यह अंतिम पैराग्राफ में उद्धृत 6.2.5 20 के लिए नहीं था, तो यह संकलन करने में विफल हो सकता है। 6.2.5 23 भी प्रासंगिक नहीं है; यह बताता है कि आकार ज्ञात है और स्थिर है यदि यह पूर्ण है, और हम पहले से ही जानते हैं कि पूर्ण होने का अर्थ है कि आकार ज्ञात है।
एरिक पोस्टपिसिल

6.2.5 20 दिलचस्प है। मैं यह अनुमान लगाता हूं कि इस परिणाम का इरादा नहीं था, लेकिन इसका मतलब यह है कि सभी प्रकार के पूरा करने वाले प्रकार के समान प्रकार के होते हैं जब अपूर्ण का आकार समान होना चाहिए। उदाहरण के लिए, सभी बिंदुओं के सरणियों का intआकार एक-दूसरे के समान होना चाहिए, और सभी बिंदुओं के सरणियों का structआकार एक-दूसरे के समान होना चाहिए, हालांकि विभिन्न बिंदुओं के सरणियों के सभी बिंदुओं का structआकार समान नहीं होना चाहिए एक दूसरे के रूप में।
एरिक पोस्टपिसिल

1
@ EricPostpischil शायद पाठ "इसी तरह, संगत प्रकारों के योग्य या अयोग्य संस्करणों को इंगित करता है, समान प्रतिनिधित्व और संरेखण आवश्यकताएं होंगी।" यह कहने के लिए व्याख्या की जानी चाहिए कि उनका T(*)[]आकार समान होना चाहिए T(*)[5], क्योंकि वे संगत प्रकार हैं और हम क्वालीफायर जोड़ या हटा सकते हैं
एमएम

विभिन्न प्रकारों के लिए संगत प्रकारों को रखने से समस्याओं का एक पूरा गुच्छा पैदा होगा, यह संभवतः एक दोष है कि मानक स्पष्ट रूप से इसे खारिज नहीं करता है
एमएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.