2016-10-09 7 views
5

करने के लिए सामग्री मैंने सोचा कि मैं कहीं पढ़ा है कि जब संकेत का उपयोग कर और हम एक से दूसरे की सामग्री की नकल करने के लिए दो विकल्प हैं कि चाहते हैं:कॉपी एक सूचक एक और

  • का उपयोग कर memcpy या
  • बस उन्हें = के साथ असाइन करना?

हालांकि कम उदाहरण में, मैं सिर्फ यह दो संकेत के लिए स्मृति आवंटन, तो दूसरा बताए, first..but तो मेरी दूसरी सूचक के प्रवेश बदलते भी बदल रहा है .. मैं गलत क्या कर रहा हूँ द्वारा परीक्षण किया : /।

typedef struct { 

    int a; 
    int b; 
    int c; 
} my_struct; 


int main(int argc, char** argv) { 

    my_struct* first = malloc(sizeof(my_struct)); 
    first->a = 100; first->b = 101; first->c = 1000; 

    my_struct* bb = malloc(sizeof(my_struct)); 

    printf("first %d %d %d\n", first->a, first->b, first->c); 
    bb = first; 
    printf("second %d %d %d\n", bb->a, first->b, bb->c); 


    first->a = 55; first->b = 55; first->c = 89; 
    printf("second %d %d %d\n", bb->a, first->b, bb->c); 
} 
+1

@MDXF: मुझे नहीं लगता कि कैसे 'strdup() 'दूरस्थ रूप से प्रासंगिक है। अगर टिप्पणियों को कम किया जा सकता है, तो मैं सुझाव को कम वोट दूंगा। –

उत्तर

7

पल आप bb = first;, bb और first कर स्मृति का एक ही स्थान की ओर इशारा करते रहे हैं। first->a = 55; first->b = 55; first->c = 89; उस स्थान पर a, b, और c के मानों को बदल देगा। first का मूल मान अभी भी स्मृति में लगी हुई है लेकिन अब इसे एक्सेस करने का कोई तरीका नहीं है।

मुझे लगता है कि आप क्या करना चाहते हैं *bb = *first; है।

+0

ठीक है स्पष्टीकरण के लिए आपको बहुत धन्यवाद, यह थोड़ा और स्पष्ट हो गया .. लेकिन सामग्री प्रतिलिपि करने के बारे में सी में सम्मेलन क्या है, यह memcpy अधिक आम है या असाइनमेंट आपने लिखा था? – malajedala

+0

मुझे नहीं लगता कि एक सम्मेलन _per se_ है। यह वास्तव में परिदृश्य पर निर्भर करता है, पॉइंटर्स से जुड़े डेटा की प्रतिलिपि बनाना, काफी उन्नत विषय है, आईएमओ। – Anzurio

2

अपने ज्ञान के बारे में memcpy सही है लेकिन आप केवल संकेत बताए जैसे आप अपने बयान जैसा कि ऊपर उल्लेख किया द्वारा " संकेत द्वारा करने के लिए स्थान बताया" की सामग्री को नहीं सौंप सकते।

आप नीचे दिए गए बयान में एक से दूसरे सूचक बताए जाते हैं:

bb = first; 

अब दोनों एक ही स्मृति स्थान के लिए इन बिंदु (bb के उपनाम के रूप first को लगता है)।

आप तो आप उपयोग कर प्रतिलिपि डेटा कॉपी करना चाहते हैं, तो "डेटा संकेत द्वारा की ओर इशारा किया" *bb = *first

+0

ठीक है, तो इन मामलों में memcpy का उपयोग करने के आसपास कोई रास्ता नहीं है? – malajedala

+1

@malajedala '* बीबी = * पहले;' – potrzebie

1

के रूप में पहले ही बताया जा चुका है, यदि आप एक सूचक first कि स्मृति में कुछ स्थान को इंगित है, और आप काम bb = first, जहां bb एक संगत सूचक प्रकार, तो bb अंक के रूप में एक ही पते के लिए है first। यह first द्वारा संदर्भित स्मृति की सामग्री की प्रतिलिपि नहीं करता है जिसका मूल रूप से bb द्वारा संदर्भित स्थान पर संदर्भित किया गया है। यह पॉइंटर के मान की प्रतिलिपि बनाता है, जो एक पता है, bb पर।

आप एक सरणी A परिभाषित हैं, तो आप काम B = AB को A की सामग्री की प्रतिलिपि करने के लिए नहीं कर सकता। आपको strcpy() या memcpy() या ऐसे कुछ फ़ंक्शन का उपयोग करना होगा। लेकिन structs अलग हैं। आप एक संरचना की सामग्रियों को एक संगत संरचना में असाइन कर सकते हैं।

अपने उदाहरण में, bb और first structs के संकेत दिए गए हैं, और जब आप bb = first लिखते हैं, अब दोनों संकेत स्मृति में एक ही पते का संदर्भ है, और तुम अब स्मृति मूल रूप bb द्वारा संदर्भित की पहुंच है - तो अब आप एक स्मृति रिसाव है!लेकिन *bb और *first structs हैं, और जब आप *bb = *first लिखते हैं, तो संरचना *first की सामग्री *bb संरचना में कॉपी की जाती है। तो अब आपके पास स्मृति में विभिन्न स्थानों पर दो अलग-अलग structs हैं, प्रत्येक एक ही तीन int एस की प्रतियों के साथ।

अपने my_struct प्रकार int के लिए सूचक निहित है, तो काम *bb = *first के बाद वे एक ही स्थान पर एक सूचक की एक प्रति स्मृति में शामिल है, लेकिन डेटा उन संकेत द्वारा संदर्भित कॉपी नहीं की जाएगी। इसलिए, यदि structs में किसी सरणी के लिए पॉइंटर होता है, तो केवल पॉइंटर की प्रतिलिपि बनाई जाएगी, सरणी की सामग्री नहीं, जिसे दो structs द्वारा साझा किया जाएगा।

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