Скопировать структуру в структуру в 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);
}
Ответы
Ответ 1
Для простых структур вы можете либо использовать memcpy
, как и вы, либо просто назначать друг от друга:
RTCclk = RTCclkBuffert;
Компилятор создаст код для копирования структуры для вас.
Важное примечание о копировании: это мелкая копия, как и с memcpy
. Это означает, что если у вас есть, например, структура, содержащая указатели, это только фактические указатели, которые будут скопированы, а не то, на что они указывают, поэтому после копии у вас будет два указателя, указывающих на одну и ту же память.
Ответ 2
Ваш код верен. Вы также можете назначить его непосредственно другому (см. ответ Йоахима Пилеборга).
Когда вы позже придете, чтобы сравнить две структуры, вам нужно быть осторожным, чтобы сравнивать структуры длинным образом, по одному члену за раз, вместо использования memcmp
; см. Как вы сравниваете структуры для равенства в C?
Ответ 3
Структура копирования в c вам просто нужно назначить значения следующим образом:
struct RTCclk RTCclk1;
struct RTCclk RTCclkBuffert;
RTCclk1.second=3;
RTCclk1.minute=4;
RTCclk1.hour=5;
RTCclkBuffert=RTCclk1;
теперь RTCclkBuffert.hour будет иметь значение 5,
RTCclkBuffert.minute будет иметь значение 4
RTCclkBuffert.second будет иметь значение 3
Ответ 4
Ваш код memcpy
верен.
Я предполагаю, что вам не хватает string.h. Поэтому компилятор предполагает неправильный прототип memcpy
и, следовательно, предупреждение.
Во всяком случае, вам просто нужно назначить структуры для простоты (как указал Йоахим Пилеборг).
Ответ 5
memcpy ожидает, что первые два аргумента будут void *.
Try:
memcpy( (void*)&RTCclk, (void*)&RTCclkBuffert, sizeof(RTCclk) );
P.S. хотя это и не обязательно, соглашение диктует скобки для оператора sizeof. Вы можете уйти с большим количеством в C, что оставляет код невозможным для поддержания, поэтому следующая конвенция является признаком хорошего программиста C.
Ответ 6
Также хороший пример.....
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;
}
Ответ 7
Я думаю, вам нужно наложить указатели на (void *), чтобы избавиться от предупреждений.
memcpy((void *)&RTCclk, (void *)&RTCclkBuffert, sizeof RTCclk);
Также вы используете sizeof без скобок, вы можете использовать это с переменными, но если RTCclk был определен как массив, sizeof of вернет полный размер массива. Если вы используете use sizeof с типом, вы должны использовать его с помощью скобок.
sizeof(struct RTCclk)