Скопировать структуру struct в C

Я хочу скопировать идентичную структуру в другую и позже использовать ее в качестве сравнения с первой. Дело в том, что мой компилятор дает мне предупреждение, когда я делаю это! Должен ли я делать это по-другому или я делаю это неправильно:

в заголовочный файл:

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

в файле 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);
}

7 ответов


для простых структур вы можете использовать memcpy как и вы, или просто назначить от одного к другому:

RTCclk = RTCclkBuffert;

компилятор создаст код для копирования структуры для вас.


важная заметка о копировании: это мелкая копия, как и с memcpy. Это означает, что если у вас есть, например, структура, содержащая указатели, это только фактические указатели, которые будут скопированы, а не то, на что они указывают, поэтому после копирования у вас будет два указателя указывая на то же самое воспоминание.


ваш код правильный. Вы также можете назначить один непосредственно другому (см. ответ Иоахима Пилеборга).

когда вы позже придете, чтобы сравнить две структуры, вам нужно быть осторожным, чтобы сравнить структуры длинный путь, по одному члену за раз, вместо использования memcmp; см. как вы сравниваете структуры для равенства в C?


копировать структуру в c вам просто нужно назначить значения следующим образом:

struct RTCclk RTCclk1;
struct RTCclk RTCclkBuffert;

RTCclk1.second=3;
RTCclk1.minute=4;
RTCclk1.hour=5;

RTCclkBuffert=RTCclk1;

теперь RTCclkBuffert.час будет иметь значение 5,

RTCclkBuffert.минута будет иметь значение 4

RTCclkBuffert.второй будет иметь значение 3


код memcpy код правильный.

Я предполагаю, что вам не хватает строки include.h. Таким образом, компилятор предполагает неправильный прототип memcpy и таким образом предупреждение.

в любом случае, вы должны просто назначить структуры для простоты (как указал Иоахим Пилеборг).


memcpy ожидает, что первые два аргумента будут void*.

попробовать: memcpy( (void*)&RTCclk, (void*)&RTCclkBuffert, sizeof(RTCclk) );

П. С. Хотя не надо, это может говорить о кронштейнах для оператор sizeof. Вы можете уйти от многого в C, что оставляет код невозможным для поддержания,поэтому следующее соглашение является признаком хорошего (работающего) программиста C.


тоже хороший пример.....

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;
}

Я думаю, вы должны бросить указатели на (void*), чтобы избавиться от предупреждений.

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

Также вы используете sizeof без скобок, вы можете использовать это с переменными, но если RTCclk был определен как массив, sizeof of вернет полный размер массива. Если вы используете use sizeof с типом, вы должны использовать скобки.

sizeof(struct RTCclk)