संरचना के बारे में क्या खास है?


81

मुझे पता है कि C में हम एक फंक्शन से एरे को नहीं लौटा सकते, लेकिन एक ऐरे को पॉइंटर। लेकिन मैं यह जानना चाहता हूं कि इसके बारे में क्या खास बात है structsजो उन्हें एरेक्ट होने के बावजूद फंक्शन्स द्वारा वापस ला सकती है।

structरैपिंग निम्न प्रोग्राम को मान्य क्यों बनाता है?


1
आप एक के साथ एक ही काम कर सकते हैं union। यूनियनों के बारे में क्या खास है?
user253751

19
आप बल्कि आप से पूछना चाहिए क्यों सरणियों सी में बहुत अजीब हैं
CodesInChaos

जब एक संरचना वापस लौटती है, यदि संरचना रजिस्टर के एक जोड़े में फिट नहीं होगी, तो संकलक द्वारा आवंटित एक 'छिपी हुई' मेमोरी, संरचना को छिपी हुई स्मृति में कॉपी किया जाता है (फिर मेमकीपी () के माध्यम से) फिर से कॉपी किया जाता है (मेमसीपी के माध्यम से) )) वह 'callers' संरचनात्मक चर। वह 'छिपी' स्मृति अन्य सभी कार्यों में खो जाती है। दो अतिरिक्त कॉल memcpy()और 'छिपी' मेमोरी का नुकसान मुख्य कारण है कि एक संरचना passed toऔर न ही returned fromएक फ़ंक्शन होना चाहिए । सर्वश्रेष्ठ नीति संरचना के लिए एक सूचक पारित करना है।
user3629249

तीन उत्तरों में से कोई भी एक संरचना के पारित होने को संबोधित नहीं कर रहा है, (बल्कि वे केवल सरणियों पर चर्चा कर रहे हैं), लेकिन वे सवाल का जवाब नहीं देते हैं।
user3629249

1
@ user3629249 - इस सवाल का जवाब देना असंभव है क्योंकि सवाल समझ की कमी पर आधारित है। प्रश्न का उत्तर देने का एकमात्र तरीका यह बताने की कोशिश करना है कि प्रश्न क्यों नहीं पूछा जा सकता है। सोचिए अगर मैंने आपसे पूछा कि "ब्लू का रंग लाल ही क्यों है?" आपको यह समझाने की जल्दी होगी कि आप सवाल का जवाब क्यों नहीं दे सकते।
होगन

जवाबों:


100

एक ही सवाल पूछने का एक बेहतर तरीका यह होगा कि "सरणियों के बारे में क्या खास है", इसके लिए वे सरणियाँ हैं जिनके पास विशेष हैंडलिंग है, structएस नहीं ।

पॉइंटर से पासिंग और रिटर्निंग एरेस का व्यवहार सी। के मूल कार्यान्वयन के लिए वापस आ जाता है "संकेत" क्षय को इंगित करता है, जिससे भ्रम का एक अच्छा सौदा होता है, खासकर लोगों में भाषा के लिए नया। दूसरी ओर, संरचनाएं बिल्ट-इन प्रकारों की तरह ही व्यवहार करती हैं, जैसे कि intएस, doubleएस आदि। इसमें एंबेडेड एरे शामिल हैं, जो लचीले एरे सदस्योंstruct को छोड़कर , जिनकी नकल नहीं की जाती है।


4
'वास्तव में भ्रम का एक अच्छा कारण'। 'x' और 'x' समान मान / पता है, यह एक प्रकार का पागलपन है। यह आश्चर्य की बात नहीं है कि नए लोगों को अप्रत्यक्ष रूप से गलत मिलता है :(
मार्टिन जेम्स

1
मेरी स्मृति मुझे धोखा दे सकती है, लेकिन क्या ऐसे समय नहीं थे जब structमूल्य से गुजरना संभव नहीं था?
एलके

5
@ मैं सोचता हूं, जब पहली बार भाषा में संरचनाएं जोड़ी गई थीं, तो शुरू में उन्हें पास करने / उन्हें कार्यों से वापस करने पर कुछ प्रतिबंध थे, लेकिन ये स्पष्ट रूप से संकलक की कमी के रूप में चिह्नित किए गए थे जो जल्द ही पर्याप्त रूप से सही हो गए थे, एक संकेत नहीं पास होने और उन्हें वापस करने के लिए कुछ भी गलत था।
स्टीव समिट

8
@jamesqf: struct Point {short x, y, z;};। आप वास्तव में उन्हें चारों ओर ले जाने के लिए पॉइंटर्स का उपयोग करना चाहते हैं? आप निश्चित रूप से इस तरह से जगह नहीं बचा रहे हैं।
मार्क VY

6
@jamesqf मुझे यकीन नहीं है कि यह एक प्रतिक्रिया के लायक है। यदि आप मानते हैं कि सी असेंबली की तुलना में बहुत अधिक नहीं है, अगर आपको लगता है कि एक पॉइंटर का उपयोग न करने का कोई कारण नहीं है, तो मैं शायद यह देख सकता हूं कि आप कैसे सोच सकते हैं कि पासिंग स्ट्रक्चर बेकार है। लेकिन हम में से बाकी के लिए, जो सी को एक उच्च-स्तरीय भाषा मानते हैं (निम्न स्तर के एक के रूप में, जैसे कि एचएलएल चलते हैं), और जो सी के प्रकार के सिस्टम को सामान्य मानते हैं (सरणियों के द्वितीय श्रेणी के दर्जे के विख्यात अपवाद के साथ) ), हम संरचनाओं को पास या वापस क्यों नहीं करना चाहेंगे? (बीटीडब्लू, आईआईआरसी, के एंड आर 1 ने कहा कि रास्ते से गुजरने वाली संरचना चल रही थी, और जब तक पुस्तक सामने नहीं आई तब तक वी 7 सीसी में काम किया।)
स्टीव समिट

38

सबसे पहले, उद्धरण के लिए C11, अध्याय §6.8.6.4, returnकथन, ( जोर मेरा )

यदि किसी returnएक्सप्रेशन के साथ एक स्टेटमेंट निष्पादित किया जाता है, तो फ़ंक्शन कॉल एक्सप्रेशन के मान के रूप में कॉलर को एक्सप्रेशन का मान वापस कर दिया जाता है।

एक संरचना चर लौटना संभव (और सही) है, क्योंकि, संरचना मूल्य वापस आ गया है। यह किसी भी आदिम डेटा प्रकार ( intउदाहरण के लिए वापस लौटना ) के समान है।

दूसरी ओर, यदि आप एक वापसी सरणी , का उपयोग करके return <array_name>, यह अनिवार्य रूप से रिटर्न पहला तत्व का पता सरणी के नोट है, जो फोन करने वाले में अमान्य हो जाता है, तो सरणी बुलाया कार्यों के लिए स्थानीय था। तो, उस तरह से सरणी वापस करना संभव नहीं है।

तो, टीएल; डीआर , एस के साथ कुछ विशेष नहीं है struct, विशेषता सरणियों में है


ध्यान दें:

C11फिर से उद्धृत , अध्याय §6.3.2.1, ( मेरा जोर )

सिवाय इसके कि जब यह sizeofऑपरेटर, _Alignofऑपरेटर, या यूनिरी &ऑपरेटर का संचालन है, या किसी सरणी को आरंभीकृत करने के लिए उपयोग किया जाने वाला एक स्ट्रिंग शाब्दिक है, तो एक अभिव्यक्ति जिसमें '' प्रकार का सरणी '' टाइप के साथ एक अभिव्यक्ति में बदल जाता है '' सूचक '' टाइप करने के लिए जो सरणी ऑब्जेक्ट के प्रारंभिक तत्व को इंगित करता है और एक अंतराल नहीं है। [...]


क्या वास्तव में OTOH है!

1
@ शुक्ल यह "दूसरे हाथ पर" के लिए संक्षिप्त नाम है :)
सौरव घोष

1
@ मुझे लगता है कि ये संक्षिप्ताक्षर लगभग उतने ही पुराने हैं जितने कि इंटरनेट। वे निश्चित रूप से यूज़नेट महिमा दिनों के दौरान बहुत उपयोग किए गए थे, और अभी भी अधिकांश मंचों में जीवित हैं। शुक्र है, अनजान के लिए भी, Google उन्हें डिकोड कर सकता है;; और केवल एक मुट्ठी भर है जो आज अक्सर इस्तेमाल किया जाता है (सबसे आम)
ची

@chi yes.Google काफी शानदार है जो उन्हें डिकोड करने में सक्षम है।

1
@ शुक्ल: आप सम-विषमों को ट्रैक करने के लिए उपयोगी फ़ाइंडर पा सकते हैं ।
जोनाथन लेफ़लर

11

structप्रकारों के बारे में कुछ खास नहीं है ; यह है कि सरणी प्रकारों के बारे में कुछ विशेष है जो उन्हें सीधे फ़ंक्शन से वापस आने से रोकता है।

एक structअभिव्यक्ति को किसी अन्य गैर-सरणी प्रकार की अभिव्यक्ति की तरह माना जाता है; यह के मूल्य का मूल्यांकन करता है struct। तो आप जैसे काम कर सकते हैं

अभिव्यक्ति वस्तु someFooके मूल्य का मूल्यांकन करती struct fooहै; ऑब्जेक्ट की सामग्री फ़ंक्शन से वापस कर दी जाती है (भले ही उन सामग्रियों में सरणियाँ हों)।

एक सरणी अभिव्यक्ति को अलग तरह से व्यवहार किया जाता है; यदि यह sizeofया एकरी &संचालकों का संचालक नहीं है, या यदि यह घोषणा में एक और सरणी को आरम्भ करने के लिए उपयोग नहीं किया जा रहा एक स्ट्रिंग शाब्दिक है, तो अभिव्यक्ति "( Tसूचक )" प्रकार "सरणी " से "सूचक T" में परिवर्तित हो जाती है , और अभिव्यक्ति का मूल्य पहले तत्व का पता है।

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


-5

संरचना में डिफ़ॉल्ट रूप से डेटा सदस्य सार्वजनिक होते हैं इसलिए संरचना के मामले में मुख्य रूप से डेटा तक पहुंच संभव है, लेकिन कक्षा के मामले में नहीं। तो, संरचना लपेटना वैध है।


1
क्या आपने देखा है कि प्रश्न C के बारे में है? सी में, वहाँ कोई है public/ privateभेद, और कोई कर रहे हैं classतों। सवाल यह है कि structकिसी सरणी के मान को वापस करने के लिए C की आवश्यकता क्यों है।
PJTraill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.