2010-09-03 5 views
6

memmove के बारे में पढ़ते समय मैंने पढ़ा कि यह स्मृति ओवरलैप्स को संभाल सकता है लेकिन मैं यह समझने में असमर्थ हूं कि दो स्ट्रिंग्स के बीच एक मेमरी ओवरलैप कैसे हो सकता है और यह फ़ंक्शन अभी भी स्मृति के ब्लॉक को सही तरीके से कैसे कॉपी कर सकता है।मेमोरी ओवरलैप कैसे होता है और इसे कैसे नियंत्रित किया जाता है?

उत्तर

5

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

बेशक, आप यूनियनों के माध्यम से आसानी से ओवरलैपिंग ऑब्जेक्ट्स भी बना सकते हैं।

यह स्पष्ट नहीं है कि प्रश्न के दूसरे भाग से आपका क्या मतलब है ("यह फ़ंक्शन अभी भी स्मृति के ब्लॉक को सही तरीके से कैसे कॉपी कर सकता है")। आप यहाँ समस्या कहां देखते हैं?

+0

मुझे नहीं पता कि फ़ंक्शन मेमोरी ओवरलैपिंग समस्या –

+0

कैसे प्रबंधित करेगा यह काम करता है जैसे स्रोत को अन्य बफर में कॉपी किया गया था, फिर गंतव्य पर कॉपी किया गया था। Memcpy() सीधे सीधे गंतव्य के लिए स्रोत कॉपी करता है। – Jefferson

3
memmove(p+1, p, 42); 

कौन सा बाइट्स अंत में शुरू कर चलती की आवश्यकता है। Memcpy() इसके बारे में एक गड़बड़ बनाता है।

+0

कड़ाई से बोलते हुए, 'memcpy' ने इस तरह से उपयोग किए जाने पर व्यवहार को अपरिभाषित किया है। यह कल्पनापूर्वक काम कर सकता है, उदाहरण के लिए यदि यह लिखा गया था कि पीछे की प्रतिलिपि बनाना तेजी से है, या यदि 'memcpy' को' memmove' 'पर कॉल के रूप में लागू किया गया था, लेकिन आपको ऐसी चीजों पर कभी भरोसा नहीं करना चाहिए। :-) –

+0

अगर वह memmove जानता है तो कभी भी memcpy का उपयोग क्यों करेगा;) –

+0

क्योंकि memcpy() तेज है। –

संबंधित मुद्दे

 संबंधित मुद्दे