Array realloc कर सकते हैं, तो पॉइंटर्स का उपयोग क्यों करें?

यह एक नौकरी प्लेसमेंट साक्षात्कार था जिसका मैंने सामना किया था। उन्होंने पूछा कि क्या हम ऐरे को फिर से चला सकते हैं, मैंने हां कहा। फिर उन्होंने पूछा - तो हमें पॉइंटर्स की आवश्यकता क्यों है क्योंकि ज्यादातर लोग तर्क देते हैं कि यह स्मृति स्थान को बर्बाद कर देता है। मैं संतोषजनक उत्तर देने में सक्षम नहीं था। यदि कोई भी शरीर कोई संतोषजनक उत्तर दे सकता है, तो मुझे बाध्य किया जाएगा। कृपया किसी भी परिस्थिति का जिक्र करें जहां उपरोक्त कथन विरोधाभास कर सकता है।

धन्यवाद।

2

4 उत्तर

आप केवल एक सरणी को आवंटित कर सकते हैं जिसे गतिशील आवंटित किया गया था। यदि इसे स्थिर रूप से आवंटित किया गया था, तो इसे [सुरक्षित रूप से] पुन: आवंटित नहीं किया जा सकता है। *

पॉइंटर्स मेमोरी में डेटा के पते पकड़ते हैं। उन्हें सी ++ में नए/डिलीट ऑपरेटर का उपयोग करके गतिशील रूप से आवंटित, हटाया जा सकता है और फिर से आवंटित किया जा सकता है।

मैं दृढ़ता से सुझाव दूंगा कि आप सी प्रोग्रामिंग भाषा पढ़ लेंगे Kernighan और Ritchie और एक ठोस C ++ पाठ जैसे C ++ ग्राउंड अप से हर्बर्ट शिलल्ट द्वारा।

गतिशील स्मृति, पॉइंटर्स, ऑफ़सेट आदि का उपयोग इन दोनों भाषाओं का उपयोग करने के लिए सभी मौलिक हैं। यह नहीं जानते कि वे कैसे काम करते हैं, और वे क्यों मौजूद हैं संभावित नियोक्ताओं के लिए आपको कम करने का संभावित कारण होगा।

* संकलक नहीं होना चाहिए आपको स्थिर रूप से आवंटित किए गए किसी भी चीज़ को पुन: आवंटित करने दें, लेकिन यदि ऐसा होता है, तो व्यवहार अपरिभाषित है

मैंने अपना एनोटेटेड सी मानक नहीं देखा है - इसलिए मैं सीधे टिप्पणी नहीं कर सकता, लेकिन मैंने कक्षाओं में ग्राउंड अप बुक का उपयोग किया है, और छात्रों को उस पाठ का उपयोग करके वास्तव में 'इसे प्राप्त करने' के लिए मिला है
जोड़ा लेखक warren, स्रोत
क्या शिल्डेट का सी ++ उनके 'एनोटेटेड सी स्टैंडर्ड' से बेहतर है?
जोड़ा लेखक Jonathan Leffler, स्रोत

Phrasing थोड़ा अजीब है, लेकिन मेरे लिए ऐसा लगता है कि साक्षात्कार प्रश्न एक खुला अंत प्रश्न था जो आपको एरे, पॉइंटर्स, गतिशील स्मृति आवंटन इत्यादि के बारे में जो कुछ पता है उसे समझाने के लिए डिज़ाइन किया गया था। यदि मैं साक्षात्कारकर्ता चाहता था तो मैं चाहता हूं int * a = malloc (10 * sizeof (int)) के बीच अंतर को व्यक्त करने के लिए उम्मीदवार; और int a [10]; । फॉलोअप प्रश्न को बहुत अच्छी तरह से नहीं कहा जाता है, लेकिन शायद यह उम्मीदवार को एक सूचक और एक सरणी के बीच अंतर की दिशा में और विचार की ट्रेन को बंद करने की दिशा में निंदा करने का प्रयास था।

5
जोड़ा

ठीक। आप एक सरणी को पुन: स्थापित नहीं कर सकते जिसे स्थिर रूप से घोषित किया गया है। पॉइंटर्स (स्थिर रूप से घोषित सरणी के बजाए) का उपयोग करने का उद्देश्य, ताकि आप अंतरिक्ष को फिर से स्थानांतरित कर सकें। मुझे लगता है, तकनीकी रूप से सही होने के लिए, आप इसे एक पॉइंटर पास करके एक स्थिर रूप से परिभाषित सरणी को फिर से चला सकते हैं, लेकिन मैं नहीं चाहता। व्यवहार को अपरिभाषित किया जाता है यदि सूचक स्मृति के लिए आवंटित किया गया था जिसे malloc द्वारा आवंटित नहीं किया गया था।

2
जोड़ा
रीयलोक फ़ंक्शन हमें पहले आवंटित क्षेत्र के आकार को बढ़ाने या घटाने देता है। (सबसे आम उपयोग क्षेत्र को बढ़ाने के लिए है।) उदाहरण के लिए, अगर हम एक सरणी में 512 तत्वों के लिए कमरा आवंटित करते हैं जिसे हम रनटाइम पर भरते हैं लेकिन पाते हैं हमें 512 से अधिक तत्वों के लिए कमरे की आवश्यकता है, हम realloc कॉल कर सकते हैं।
जोड़ा लेखक iankits, स्रोत
linux.die.net/man/3/realloc - अभी भी सहायता नहीं करेगा स्थैतिक रूप से आवंटित वस्तुओं
जोड़ा लेखक warren, स्रोत

मैं वास्तव में समझ नहीं पा रहा हूं कि पॉइंटर्स "कचरा स्मृति" का उपयोग कैसे करें। Realloc समारोह: -

void *realloc(void *ptr, size_t size);

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

1
जोड़ा
"अपशिष्ट स्मृति" का अर्थ यह हो सकता है कि int * ra = malloc (10 * sizeof (int)); int ra [10] की तुलना में अधिक संग्रहण के उपयोग में परिणाम; आपके मॉलोक कार्यान्वयन के ऊपरी हिस्से के कारण। लेकिन लागू होने वाले ढेर पर सरणी का उपयोग करने के बेहतर कारण हैं।
जोड़ा लेखक Steve Jessop, स्रोत
ओह, और जब सरणी किसी संरचना द्वारा प्रतिनिधित्व की गई चीज़ से संबंधित होती है, तो स्पष्ट स्मृति "अपशिष्ट" है जो सरणी में एक सूचक को संग्रहीत करता है, बजाय संरचना में सरणी को एम्बेड करने और सदस्य नाम तक पहुंचने के बजाय, एक अतिरिक्त आकार (शून्य *) बाइट्स।
जोड़ा लेखक Steve Jessop, स्रोत