Copier la structure en struct dans C

Je souhaite copier une structure identique dans une autre et l’utiliser ultérieurement comme une comparaison avec la première. La chose est que mon compilateur me donne un avertissement quand je fais comme ça! Dois-je le faire d’une autre manière ou suis-je en train de le faire mal:

En en-tête Fichier:

extern struct RTCclk { uint8_t second; uint8_t minute; uint8_t hour; uint8_t mday; uint8_t month; uint8_t year; } RTCclk; 

En fichier C:

 struct RTCclk RTCclk; struct RTCclk RTCclkBuffert; void FunctionDO(void) { ... // Some Code /* Copy first struct values into the second one */ memcpy(&RTCclk, &RTCclkBuffert, sizeof RTCclk); } 

Pour les structures simples, vous pouvez soit utiliser memcpy comme vous le faites, soit simplement affecter l’un à l’autre:

 RTCclk = RTCclkBuffert; 

Le compilateur créera du code pour copier la structure pour vous.


Une note importante à propos de la copie: c’est une copie superficielle, comme avec memcpy . Cela signifie que si vous avez par exemple une structure contenant des pointeurs, ce ne sont que les pointeurs réels qui seront copiés et non ce qu’ils indiquent, donc après la copie, vous aurez deux pointeurs pointant vers la même mémoire.

Votre code est correct. Vous pouvez également en atsortingbuer un directement à l’autre (voir la réponse de Joachim Pileborg ).

Lorsque vous comparez plus tard les deux structures, vous devez faire attention à comparer les structures dans le sens long, un membre à la fois, au lieu d’utiliser memcmp ; voir Comment comparer les structures pour l’égalité dans C?

copier la structure dans c, il vous suffit d’affecter les valeurs comme suit:

 struct RTCclk RTCclk1; struct RTCclk RTCclkBuffert; RTCclk1.second=3; RTCclk1.minute=4; RTCclk1.hour=5; RTCclkBuffert=RTCclk1; 

maintenant RTCclkBuffert.hour aura la valeur 5,

RTCclkBuffert.minute aura la valeur 4

RTCclkBuffert.second aura la valeur 3

Votre code memcpy est correct.

Je suppose que vous manquez d’un include de ssortingng.h. Donc, le compilateur suppose un prototype erroné de memcpy et donc l’avertissement.

Quoi qu’il en soit, vous devez simplement atsortingbuer les structures par souci de simplicité (comme l’a souligné Joachim Pileborg).

memcpy s’attend à ce que les deux premiers arguments soient nuls *.

Essayez: memcpy( (void*)&RTCclk, (void*)&RTCclkBuffert, sizeof(RTCclk) );

PS bien que non nécessaire, la convention dicte les crochets pour l’opérateur sizeof. Vous pouvez vous en tirer avec beaucoup de choses en C qui ne permettent pas de maintenir le code, alors la convention suivante est la marque d’un bon programmeur C (utilisable).

Aussi un bon exemple …..

 struct point{int x,y;}; typedef struct point point_t; typedef struct { struct point ne,se,sw,nw; }rect_t; rect_t temp; int main() { //rotate RotateRect(&temp); return 0; } void RotateRect(rect_t *givenRect) { point_t temp_point; /*Copy struct data from struct to struct within a struct*/ temp_point = givenRect->sw; givenRect->sw = givenRect->se; givenRect->se = givenRect->ne; givenRect->ne = givenRect->nw; givenRect->nw = temp_point; } 

Je pense que vous devriez lancer les pointeurs vers (void *) pour vous débarrasser des avertissements.

 memcpy((void *)&RTCclk, (void *)&RTCclkBuffert, sizeof RTCclk); 

En outre, vous utilisez sizeof sans crochets, vous pouvez l’utiliser avec des variables mais si RTCclk a été défini comme un tableau, sizeof de retourne la taille du tableau. Si vous utilisez use sizeof avec le type, vous devez utiliser des crochets.

 sizeof(struct RTCclk)