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