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.
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
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
Vous devez montrer où 'a' et' b' sont venus –