2011-04-01 7 views
10

Confundo cómo leer los punteros copiados en una matriz usando memcpy. Lo que he intentado a continuación, pero no funciona.memcpy y punteros

Básicamente, he asignado un bloque de memoria en el que estoy copiando punteros similares a la moda de la matriz, pero durante el nuevo intento no está funcionando. Si bien esto funciona correctamente con los tipos de datos básicos

Quiero almacenar cualquier cosa en el bloque element, puede ser integers o .

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

En el código anterior funciona bien, pero f1_intf2_int_ptr no funciona.

+0

Nota: Todo este tipo de conversión desde y hacia 'void *' (y la macro) no está haciendo que su código sea bastante desagradable. ¿Hay alguna razón por la que estés usando 'void *' en todas partes? –

+0

Esto funciona para todos los tipos básicos, pero no funciona solo para punteros. – Avinash

+0

Debería intentar aclarar su código si desea que se lea. C es un engaño (http://www.gnu.org/fun/jokes/unix-hoax.html) no es un argumento para codificar de esa manera. – mouviciel

Respuesta

7

f2_int_ptr() necesidades para convertirse en esto:

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

Tenga en cuenta el sutil cambios en los argumentos memcpy().

Nota: ¡Realmente, realmente, realmente no escribiría un código como este! Es increíblemente difícil de seguir.

+0

Se agregó más a la pregunta. – Avinash

+0

Si uso puntero-a-puntero, entonces tengo que asegurarme de que siempre se asignan los elementos que van al bloque, no puedo tener elementos de la pila. – Avinash

+0

@Avniash: No hay elementos de pila en mi código anterior. –

0

Código es muy feo, así que incluso no saber cómo debería obras, sino: ¿Por qué u Utilización & v aquí:

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

v es propio puntero:

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

Se vuelca sin eso. Quería leer de la matriz, no estoy seguro de cómo hacerlo y la matriz tiene un puntero copiado. – Avinash

0

Si está almacenando los punteros en los elementos, creo que la memcpy final necesita usar & v para copiar el elemento al puntero v. Similar a v = elementos [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

Este núcleo se vuelca. – Avinash

+0

Ok. Con la edición, creo que veo lo que estás intentando hacer (Copiar el puntero en elementos), así que lo actualicé. – sickgemini

+0

Esto también se volcará, supongo que necesito asignar la v antes de recuperar el elemento. – Avinash

0

gracias Chicos, funcionó finalmente. Supongo que no he asignado el espacio donde copiar 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

Este código no funcionará; tienes una pérdida de memoria –

+0

Por qué esto no funciona, – Avinash

+0

porque tiene una pérdida de memoria. No está liberando 'v' en el primer o segundo ciclo. Además, está almacenando valores 'int' en' elements', no 'int *'. Ver mi respuesta –