2011-04-01 23 views
10

Memcpy kullanarak bir dizide kopyalanan işaretçilerin nasıl okunacağını karıştırıyorum. Denediğim şey aşağıdadır, ancak çalışmaz.memcpy ve işaretçiler

Temel olarak, dizi modasına benzer işaretçileri kopyaladığım bellek bloğunu ayırdım, ancak yeniden deneme sırasında çalışmıyor. Bu temel veri tipleri ile çalışır iken düzgün

ben element blokta şey saklamak istediğiniz, O integers veya pointers olabilir. gayet iyi çalışıyor fakat f2_int_ptr çalışmıyor f1_int Yukarıdaki kodda

#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; 
} 

.

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

Not: 'void * '(ve makro) arasındaki tüm bu yazım hataları kodunuzu oldukça kötü yapmıyor. Her yerde * void * kullanmanın bir nedeni var mı? –

+0

Bu, tüm temel türler için çalışır, ancak yalnızca işaretçiler için çalışmıyor. – Avinash

+0

Okumayı düşünüyorsanız, kodunuzu açıklığa kavuşturmaya çalışmalısınız. Bir aldatmaca olan C (http://www.gnu.org/fun/jokes/unix-hoax.html) bu şekilde kodlamak için bir argüman değildir. – mouviciel

cevap

7

f2_int_ptr() ihtiyaçlar:

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

v işaretçi kendisidir:

+0

Soru için daha fazla eklendi. – Avinash

+0

İşaretçi-işaretçisi kullanırsam, her zaman bloğa giden öğelerin her zaman ayrıldığından emin olmalıyım, yığından öğe alamıyorum. – Avinash

+0

@Avniash: Yukarıdaki kodumda yığın öğesi yok. –

0

Kod çok çirkin, bu yüzden nasıl eserlerini gerektiği bile bilmiyorum ama: Neden u burada & v kullanıyor Bu olmak için:

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); 
    } 
} 

İnce düşünün memcpy() bağımsız değişkenleri değiştirir.

Not: Gerçekten, gerçekten, gerçekten böyle bir kod yazmazdım! Takip etmek inanılmaz derecede zor.

+0

Bu olmadan döker. Diziden okumak istedim, bunu nasıl yapacağımı bilmiyorum ve dizininin işaretçisi kopyalandı. – Avinash

0

İşaretçiyi elemanslarda saklıyorsanız, final memcpy öğesinin işaretçiye kopyalamak için & v değerini kullanması gerektiğini düşünüyorum v. [V = elements [i] öğesine benzer.

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

Bu çekirdek dökümler. – Avinash

+0

Tamam. Düzenleme ile ne yapmaya çalıştığınızı görüyorum, (İşaretçiyi elemanlara kopyalayın.) Böylece güncelledim. – sickgemini

+0

Bu da dökülecek, sanırım elementi geri almadan önce v'yi ayırmam gerekiyor. – Avinash

0

Teşekkürler Guys, sonunda işe yaradı. Sanırım memcümeyi kopyalayacağınız alanı ayırmadım.

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

Bu kod çalışmayacak; hafıza sızıntınız var. –

+0

Neden bu çalışmaz, – Avinash

+0

, çünkü bir bellek sızıntınız var. Birinci veya ikinci döngüde 'v' serbest değilsiniz. Ayrıca, “int” değerlerini '' '' '' '' '' değil '' '' içinde saklıyorsunuz. Cevabımı gör. –