我想将一个相同的结构复制到另一个结构中,然后将其用作第一个结构的比较。问题是,当我这样做时,我的编译器给了我一个警告!我应该以其他方式做到这一点还是我做错了:
标题文件:
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);
}
答案 0 :(得分:124)
对于简单的结构,你可以像你一样使用memcpy
,或者只是从一个分配到另一个:
RTCclk = RTCclkBuffert;
编译器将创建代码来为您复制结构。
关于复制的一个重要说明:它是一个浅表副本,就像memcpy
一样。这意味着如果你有例如一个包含指针的结构,它只是要复制的实际指针,而不是它们所指向的指针,因此在复制后你将有两个指针指向同一个内存。
答案 1 :(得分:18)
您的代码是正确的。您也可以直接将一个分配给另一个(参见Joachim Pileborg's answer)。
当你后来比较两个结构时,你需要小心地比较结构,一次一个成员,而不是memcmp
;见How do you compare structs for equality in C?
答案 2 :(得分:2)
复制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
答案 3 :(得分:1)
您的memcpy
代码是正确的。
我的猜测是你缺少string.h的包含。因此,编译器假设memcpy
的原型错误,因此警告。
无论如何,你应该为了简单起见而分配结构(正如Joachim Pileborg指出的那样)。
答案 4 :(得分:1)
也是一个很好的例子......
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;
}
答案 5 :(得分:0)
我认为你应该将指针强加给(void *)以消除警告。
memcpy((void *)&RTCclk, (void *)&RTCclkBuffert, sizeof RTCclk);
此外,您使用sizeof而不使用括号,您可以将其与变量一起使用,但如果将RTCclk定义为数组,则sizeof将返回数组的完整大小。如果你使用sizeof类型,你应该使用括号。
sizeof(struct RTCclk)