2011-09-16 21 views
9

memmove/memcpy/strcpy के लिए प्रोटोटाइप में दूसरा आर्ग समान हैं"कॉन्स्ट शून्य *" का अर्थ memmove में क्या है? उदाहरण के लिए :

void *memmove(void *dest, const void *src, size_t n); //const void* 
char *strcpy(char *dest, const char *src); //const char* 

लेकिन जाहिरा तौर पर, गंतव्य और src ओवरलैप है, तो स्रोत की सामग्री को बदल दिया जाएगा अगर, स्थिरांक शून्य/चार का उल्लंघन *?

उत्तर

20

const void* का अर्थ है कि संदर्भ उस पॉइंटर के माध्यम से संशोधित नहीं किया जाएगा।

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

वैसे, strcpy के मामले में, क्षेत्र ओवरलैप होने पर व्यवहार अनिर्धारित है, और सी 99 में हस्ताक्षर char *strcpy(char * restrict s1, const char * restrict s2); है। लेकिन memmove के लिए, aliasing ठीक है। इसे ओवरलैपिंग क्षेत्रों को देकर आपने इसे dest क्षेत्र को संशोधित करने के लिए "अनुमति" दी है, और यह वह करेगा।

+0

सहमत है, यह सही है। – Alcott

+0

क्या आपका मतलब है, अगर मैं यह सुनिश्चित नहीं कर सकता कि क्या dest और src ओवरलैप है या नहीं, तो मैं बेहतर स्ट्रैपी का उपयोग नहीं करता, है ना? – Alcott

+1

@ एल्कोट: यह सही है। अभ्यास में आप जो अधिक संभावना देखेंगे वह यह है कि यदि आपके क्षेत्र 'dest

4

इसका मतलब है memmove गारंटी देता है कि यह सीधेsrc द्वारा दी गई मेमोरी को संशोधित करेगा।

बेशक यदि दो ब्लॉक ओवरलैप memmove तथाकथित "कॉन्स्ट" मेमोरी बदल देंगे। const एक नाम से जुड़े अनुबंध है। वास्तविक स्मृति को केवल पढ़ने के लिए कोई रास्ता नहीं है।

+0

@downvoter टिप्पणी करने के लिए देखभाल? – cnicutar

+0

आपके संपादन के आधार पर डाउनवोट हटा दिया गया। –

+0

@Praetorian I अक्सर नहीं जानता कि मैं किस बारे में बात कर रहा हूं लेकिन मुझे टिप्पणियां पसंद हैं इसलिए मैं सीख सकता हूं :-) – cnicutar

7

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

3

जैसा कि उपरोक्त ज्ञापन "src" सूचक के माध्यम से स्मृति की सामग्री को संशोधित नहीं करेगा बल्कि "dest" सूचक के माध्यम से होगा।

कॉन्स्टेंस इंगित करता है कि पॉइंटर्स का उपयोग कैसे किया जाता है, यह कोई स्मृति सुरक्षा नहीं जोड़ता है।

यदि दोनों पॉइंटर्स मेमोरी के ओवरलैपिंग क्षेत्र को इंगित करते हैं तो कुछ भी हो सकता है क्योंकि यह परिभाषित नहीं किया गया है कि प्रतिलिपि "src" से शुरू होगी और वृद्धि होगी या "src + n" और कमी से शुरू होगी।

+0

मुझे दोहराए गए उत्तर की तरह दिखने के लिए खेद है, उसी समय मैंने उपरोक्त पोस्ट किया था –

+0

कि हर तरह की चीज हर समय होती है, यह कोई समस्या नहीं है। आमतौर पर उत्तर में सूक्ष्म मतभेद होते हैं, भले ही वे काफी समान होते हैं, और अक्सर एक ही चीज़ के कई स्पष्टीकरण के लिए काफी उपयोगी होता है - एक पाठक उनमें से एक को सर्वश्रेष्ठ समझ जाएगा, कोई और दूसरा समझ जाएगा। –

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