Copie d'un pointeur de contenu à un autre
J'ai pensé que je ai lu quelque part que lors de l'utilisation de pointeurs et nous voulons copier le contenu de l'un à l'autre qu'il y a deux options:
- à l'aide de memcpy ou
- juste de les assigner avec = ?
Cependant dans la partie inférieure exemple, je l'ai juste testé par l'allocation de mémoire pour les deux pointeurs, puis l'attribution de la deuxième, de modifier la première..mais alors l'entrée de mon deuxième pointeur est également en train de changer.. Ce que je fais de mal :/.
typedef struct {
int a;
int b;
int c;
} my_struct;
int main(int argc, char** argv) {
my_struct* first = malloc(sizeof(my_struct));
first->a = 100; first->b = 101; first->c = 1000;
my_struct* bb = malloc(sizeof(my_struct));
printf("first %d %d %d\n", first->a, first->b, first->c);
bb = first;
printf("second %d %d %d\n", bb->a, first->b, bb->c);
first->a = 55; first->b = 55; first->c = 89;
printf("second %d %d %d\n", bb->a, first->b, bb->c);
}
- Je ne vois pas comment
strdup()
est à distance pertinentes. Si les commentaires peut-être-ont voté, j'avais le bas-vote de la suggestion.
Vous devez vous connecter pour publier un commentaire.
Le moment vous ne
bb = first;
,bb
etfirst
pointent vers le même emplacement de mémoire.first->a = 55; first->b = 55; first->c = 89;
va changer les valeurs poura
,b
, etc
à cet endroit. La valeur d'origine defirst
, est toujours en attente dans la mémoire, mais pas moyen d'y accéder plus.Je pense que ce que vous pouvez faire est de
*bb = *first;
.Vos connaissances sur
memcpy
est correct, mais vous ne pouvez pas affecter le contenu de "emplacement indiqué par les indicateurs" juste par l'affectation de pointeurs comme vous l'avez fait dans votre déclaration mentionnée ci-dessus.De l'affectation d'un pointeur à l'autre dans la déclaration suivante:
Maintenant ces deux pointent vers le même emplacement de mémoire (pensez à
bb
comme alias pourfirst
).Si vous souhaitez copier les données, puis vous copiez à l'aide de "données pointées par des pointeurs"
*bb = *first
*bb = *first;
Comme cela a déjà été souligné, si vous avez un pointeur
first
qui pointe vers un emplacement dans la mémoire, et vous rendre la cessionbb
=first
, oùbb
est un compatible de type pointeur, puisbb
points à la même adresse quefirst
. Ce n'est pas de copier le contenu de la mémoire référencée parfirst
à l'emplacement initialement référencé parbb
. Il copie la valeur du pointeur, qui est une adresse, àbb
.Si vous définissez un tableau
A
, vous ne pouvez pas procéder à la cessionB = A
pour copier le contenu deA
àB
. Vous devez utiliserstrcpy()
oumemcpy()
ou certaines de ces fonctions. Mais les structures sont différentes. Vous pouvez affecter le contenu d'une structure compatible sur la struct.Dans votre exemple,
bb
etfirst
sont des pointeurs sur des structures, et quand vous écrivezbb = first
, maintenant, les deux pointeurs de référence à la même adresse en mémoire, et vous n'avez plus accès à la mémoire à l'origine référencé parbb
-- alors maintenant, vous avez une fuite de mémoire! Mais*bb
et*first
sont les structures, et quand vous écrivez*bb = *first
, le contenu de la structure*first
sont copiés à la structure*bb
. Alors maintenant, vous avez deux structures, à différents emplacements dans la mémoire, chacun avec des copies d'une même troisint
s.Si votre
my_struct
type de contenu d'un pointeur versint
, puis, après la cession*bb = *first
ils contiennent chacun une copie d'un pointeur vers le même emplacement dans la mémoire, mais les données référencées par ces pointeurs ne seront pas copiés. Donc, si les structures figurant un pointeur sur un tableau, seul le pointeur de la copie, et non pas le contenu de la matrice, ce qui serait partagé par les deux structures.