2011-04-01 11 views
10

मैं memcpy का उपयोग कर सरणी में कॉपी पॉइंटर्स को पढ़ने के तरीके पर भ्रमित हूं। मैंने जो कोशिश की है, वह निम्नलिखित है, लेकिन काम नहीं करता है।memcpy और pointers

असल में, मैंने स्मृति की ब्लॉक आवंटित की है जिसमें मैं सरणी फैशन के समान पॉइंटर्स कॉपी कर रहा हूं, लेकिन प्रतिशोध के दौरान यह काम नहीं कर रहा है। हालांकि यह मूल डेटा प्रकारों के साथ ठीक से काम करता है

मैं element ब्लॉक में कुछ भी स्टोर करना चाहता हूं, यह integers या pointers हो सकता है।

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define INDEX(x) ((char *)elements + (sizeof(int*) * (x))) 
int size = 10; 

void f2_int_ptr() {  
    int i = 0; 
    void *elements = (void*)malloc(size * sizeof(int*)); 
    for (i = 0; i < size; i++) { 
     int *v = (int *) malloc (sizeof(int)); 
     memcpy (v, &i, sizeof (int)); 


     memcpy (INDEX(i) , v, sizeof (int*)); 
    } 
    for (i = 0; i < size; i++) { 
     int *v = (int*)0; 
     memcpy (v, INDEX(i), sizeof(int *)); 
     printf ("%d\n", *v); 
    } 
} 
void f1_int() { 
    int i = 0; 
    void *elements = (void*)malloc(size * sizeof(int)); 
    for (i = 0; i < size; i++) { 
     memcpy (INDEX(i) , &i, sizeof (int)); 
    } 
    for (i = 0; i < size; i++) { 
     int v; 
     memcpy (&v, INDEX(i), sizeof (int)); 
     printf ("%d\n", v); 
    } 
} 
int main(){ 
    f1_int(); 
    f2_int_ptr(); 
    return 0; 
} 
ऊपर कोड f1_int ठीक काम करता है लेकिन f2_int_ptr काम नहीं करता है में

+0

नोट: यह सब टाइपकास्टिंग 'शून्य * '(और मैक्रो) से और आपके कोड को बहुत बुरा बना रहा है। क्या कोई कारण है कि आप हर जगह 'शून्य *' का उपयोग कर रहे हैं? –

+0

यह सभी बुनियादी प्रकारों के लिए काम करता है, लेकिन केवल पॉइंटर्स के लिए काम नहीं करता है। – Avinash

+0

यदि आप इसे पढ़ना चाहते हैं तो आपको अपने कोड को स्पष्ट करने का प्रयास करना चाहिए। सी एक धोखाधड़ी (http://www.gnu.org/fun/jokes/unix-hoax.html) इस तरह से कोड करने का तर्क नहीं है। – mouviciel

उत्तर

7

f2_int_ptr() जरूरतों:

memcpy (&v, INDEX(i), sizeof (int)); 

वी सूचक ही है यह बनने के लिए:

void f2_int_ptr() { 
    int i = 0; 
    void *elements = malloc(size * sizeof(int*)); 

    for (i = 0; i < size; i++) { 
     int *v = malloc (sizeof(int)); 
     memcpy (v, &i, sizeof (int)); 
     memcpy (INDEX(i) , &v, sizeof (int*)); 
    } 

    for (i = 0; i < size; i++) { 
     int *v; 
     memcpy (&v, INDEX(i), sizeof(int *)); 
     printf ("%d\n", *v); 
    } 
} 

सूक्ष्म नोट करें memcpy() तर्कों में परिवर्तन।

नोट: मैं वास्तव में, वास्तव में, वास्तव में, इस तरह कोड नहीं लिखूंगा! इसका पालन करना बेहद मुश्किल है।

+0

प्रश्न के लिए और अधिक जोड़ा गया। – Avinash

+0

यदि मैं पॉइंटर-टू-पॉइंटर का उपयोग करता हूं तो मुझे हमेशा यह सुनिश्चित करना होगा कि ब्लॉक में जाने वाले तत्व हमेशा आवंटित किए जाते हैं, मेरे पास स्टैक से तत्व नहीं हो सकते हैं। – Avinash

+0

@Avniash: उपरोक्त मेरे कोड में कोई स्टैक तत्व नहीं हैं। –

0

कोड बहुत बदसूरत है, इसलिए मैं भी नहीं जानता कि यह कैसे काम करता है चाहिए लेकिन: यू & v यहाँ क्यों उपयोग कर रहे हैं:

int *v = (int*)0; 
+0

यह इसके बिना डंप करता है। मैं सरणी से पढ़ना चाहता था, मुझे यकीन नहीं है कि यह कैसे करें और सरणी में सूचक की प्रतिलिपि बनाई गई है। – Avinash

0

आप elemnts में संकेत भंडारण कर रहे हैं, मुझे लगता है कि अंतिम memcpy सूचक वी के तत्व को कॉपी करने के & वी का उपयोग करने की जरूरत है। वी के समान = तत्वों [i]।

void f2_int_ptr() {  
    int i = 0; 
    void *elements = (void*)malloc(size * sizeof(int*)); 
    for (i = 0; i < size; i++) { 
     int *v = (int *) malloc (sizeof(int)); 
     memcpy (v, &i, sizeof (int *)); 


     memcpy (INDEX(i) , &v, sizeof (int*)); 
    } 
    for (i = 0; i < size; i++) { 
     int *v = (int *)0; 
     memcpy (&v, INDEX(i), sizeof(int *)); 
     printf ("%d\n", *v); 
    } 
} 
+0

यह कोर डंप। – Avinash

+0

ठीक है। संपादन के साथ मुझे लगता है कि मैं देख रहा हूं कि आप क्या करने की कोशिश कर रहे हैं, (पॉइंटर को तत्वों में कॉपी करें।) इसलिए मैंने अपडेट किया है। – sickgemini

+0

यह भी डंप होगा, मुझे लगता है कि मुझे तत्व वापस लेने से पहले वी आवंटित करने की आवश्यकता है। – Avinash

0

धन्यवाद दोस्तों, यह अंततः काम करता है। मुझे लगता है कि मैंने उस स्थान को आवंटित नहीं किया है जहां memcpy की प्रतिलिपि बनाना है।

void f2_int_ptr() {  
    int i = 0; 
    void *elements = (void*)malloc(size * sizeof(int*)); 
    for (i = 0; i < size; i++) { 
     int *v = (int *) malloc (sizeof(int)); 
     memcpy (v, &i, sizeof (int)); 

     memcpy (INDEX(i) , v, sizeof (int*)); 
    } 
    for (i = 0; i < size; i++) { 
     int *v = (int *) malloc (sizeof(int*)); 
     memcpy (v, INDEX(i), sizeof(int*)); 
     printf ("%d\n", *v); 
    } 
} 
+0

यह कोड काम नहीं करेगा; आपके पास मेमोरी लीक है। –

+0

यह क्यों काम नहीं करेगा, – Avinash

+0

क्योंकि आपके पास मेमोरी रिसाव है। आप पहले या दूसरे लूप में 'v' को मुक्त नहीं कर रहे हैं। साथ ही, आप 'int'' में 'int' मानों को संग्रहीत कर रहे हैं, 'int *' नहीं। मेरा जवाब देखें –

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