2015-12-04 3 views
1

J'ai eu du mal avec ça. Ce que je trouve ici sur stackoverflow, et d'autres endroits était juste faire:Comment copier un tableau dynamiquement alloué de struct?

memcpy(&a, &b, sizeof(b)); 

Mais pour moi, cela ne fonctionne pas. J'ai donc pensé, je partage ce qui a fonctionné pour moi sans aucun comportement inattendu.

+0

sizeof (b) vous indiquera la taille du pointeur, pas la taille du bloc de mémoire b pointe vers. Ainsi, votre ligne de code ne copiera que 4 ou 8 octets en fonction de l'architecture du système (32 ou 64 bits). Vous devez passer le troisième paramètre à memcpy pour indiquer réellement la quantité de mémoire à copier. – bruceg

+1

oui, j'ai réalisé/compris/lu cela maintenant :), mais pour une raison quelconque c'est ce que je trouve comme solution acceptée pour les questions: /. – Snowman

+0

Vous devez montrer où 'a' et' b' sont venus –

Répondre

1

Dans mon cas, les solutions précédentes ne fonctionnaient pas correctement, par ex. celui dans la question! (il a copié environ la moitié du premier élément seulement).
Donc, dans le cas où, quelqu'un a besoin d'une solution, qui vous donnera des résultats corrects, la voici:

memcpy(a, b, n * sizeof(*b)); 

détail:

int i, n = 50; 
struct YourStruct *a, *b; 

a = calloc(n, sizeof(*a)); 
b = malloc(n * sizeof(*b)); 
for (i = 0; i < n; ++i) { 
    // filling a 
} 

memcpy(b, a, n * sizeof(*a)); // <----- memcpy 'n' elements from 'a' to 'b' 

if (a != NULL) free(a); // free 'a' 
a = calloc(2*n, sizeof(*a)); // 'a' is size 2n now 

memcpy(a, b, n * sizeof(*b)); // <------ memcpy back the 'n' elements from 'b' to 'a' 

// do other stuff with 'a' (filling too)... 

Quelques notes:

  • J'ai utilisé calloc pour un, parce que dans la partie '// remplissage' je faisais opérations nécessitant des données initialisées.
  • J'aurais pu utiliser aussi Realloc.
  • J'étais en quelque sorte en train de faire un tableau croissant dynamiquement (avec une taille doublée -> log (n)), mais ici je l'ai simplifié.
  • Vous devez vérifier si l'allocation de mémoire est réussie ou non (a, b NULL ou non). Mais ici, j'ai supprimé ces contrôles pour la simplification.
+1

Vous avez donné les mauvais arguments à calloc –

+0

Merci de l'avoir signalé, il était malloc avant, et je viens de le copier. Cela a causé la faute de frappe. – Snowman

+1

le code affiché peut entraîner un événement de faute seg si le 'calloc()' ou le 'malloc()' échoue. Vérifiez toujours (! = NULL) la valeur renvoyée par n'importe quelle fonction d'allocation de mémoire (malloc, calloc, realloc) avant d'utiliser cette valeur. – user3629249

2

Supposons que vous avez:

#define N 42 
struct struct_name *a = malloc(sizeof *a * N); // allocate N objects 
struct struct_name *b = malloc(sizeof *b * N); // allocate N objects 

l'appel memcpy correct pour copier le tableau d'objets de structure est:

memcpy(a, b, sizeof *a * N); 
+0

oui, exactement ce que j'ai écrit dans ma réponse. – Snowman