memcpy et pointeurs

je suis confus sur la façon de lire les pointeurs copiés dans un tableau en utilisant memcpy. Voici ce que j'ai essayé, mais ne fonctionne pas.

fondamentalement, j'ai alloué bloc de mémoire dans lequel je suis en train de copier des pointeurs semblables à la mode array, mais pendant le rejugement il ne fonctionne pas. Alors que cela fonctionne avec les types de données de base correctement

je veux stocker quoi que ce soit dans le element bloc, Il peut être soit integers ou 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 ( "%dn", *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 ( "%dn", v );
    }
}
int main(){
    f1_int();
    f2_int_ptr();
    return 0;
}

Dans le code ci-dessus f1_int fonctionne très bien mais f2_int_ptr ne fonctionne pas.

10
demandé sur Avinash 2011-04-01 14:40:24

4 réponses

f2_int_ptr() besoin afin de devenir ce:

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

notez les changements subtils de memcpy() arguments.

Note: j'ai vraiment, vraiment, vraiment, de ne pas écrire de code comme celui-ci! Il est incroyablement difficile à suivre.

7
répondu Oliver Charlesworth 2011-04-01 11:32:35

le Code est très laid, donc je ne sais même pas comment il devrait fonctionner mais: Pourquoi sont-u à l'aide de &v ici:

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

v est pointeur lui-même:

int *v = (int*)0;
0
répondu IProblemFactory 2011-04-01 10:44:56

merci Les gars, ça a enfin marché. je suppose que je n'ai pas alloué de l'espace où copier 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
répondu Avinash 2011-04-01 11:26:56

si vous stockez les pointeurs dans les elemnts, je pense que la memcpy finale doit utiliser &v pour copier l'élément dans le pointeur v. similaire à v=elements[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
répondu sickgemini 2011-04-01 11:39:06