Structure de copie à structure en C

je veux copier une structure identique dans une autre et ensuite l'utiliser comme une comparaison avec la première. Le truc c'est que mon compilateur me donne un avertissement quand je fais ça! Si je le fais d'une autre manière ou si je le fais mal:

dans le fichier d'en-tête:

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

dans le 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);
}
48
demandé sur vaxquis 2012-02-03 14:36:59

7 réponses

pour les structures simples, vous pouvez utiliser memcpy comme vous le faites, ou tout simplement assigner de l'un à l'autre:

RTCclk = RTCclkBuffert;

le compilateur va créer du code pour copier la structure pour vous.


une note importante sur la copie: c'est une copie superficielle, comme avec memcpy . Cela signifie que si vous avez par exemple une structure contenant des pointeurs, c'est seulement les pointeurs réels qui seront copiés et pas ce qu'ils pointent pour, ainsi, après la copie, vous aurez deux pointeurs pointant vers la même mémoire.

115
répondu Joachim Pileborg 2014-10-22 14:07:01

votre code est correct. Vous pouvez aussi attribuer l'un à l'Autre (voir réponse de Joachim Pileborg ).

quand vous venez plus tard pour comparer les deux structures, vous devez faire attention à comparer les structures le long chemin, un membre à la fois, au lieu d'utiliser memcmp ; voir comment comparez-vous les structures pour l'égalité en C?

16
répondu Graham Borland 2017-05-23 12:09:53

structure de copie en c vous avez juste besoin d'assigner 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.la minute aura la valeur 4

RTCclkBuffert.la seconde aura la valeur 3

2
répondu Hemant Metalia 2012-02-03 10:46:04

votre code memcpy est correct.

je pense que vous n'avez pas d'inclusion de chaîne.h. Ainsi, le compilateur suppose un mauvais prototype de memcpy et donc l'avertissement.

de toute façon, vous devez juste assigner les structures par souci de simplicité (comme Joachim Pileborg l'a fait remarquer).

1
répondu undur_gongor 2012-02-03 11:22:12

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

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

P. S. bien qu'elle ne soit pas nécessaire, la Convention impose les crochets pour la taille de l'opérateur. Vous pouvez vous en tirer avec beaucoup en C qui laisse le code impossible à maintenir, donc suivre la convention est la marque d'un bon programmeur C (employable).

1
répondu Dan 2015-01-12 18:44:07

est 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;
}
0
répondu newrev426 2013-10-03 02:46:56

je pense que tu devrait jeter les pointeurs (void *) pour se débarrasser des mises en garde.

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

vous avez aussi utiliser sizeof sans parenthèses, vous pouvez l'utiliser avec des variables mais si RTCclk a été défini comme un tableau, sizeof of retournera la taille complète du tableau. Si vous utilisez utiliser sizeof avec le type que vous devriez utiliser avec les crochets.

sizeof(struct RTCclk)
0
répondu Alpha 2016-01-19 11:44:42