将结构复制到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); } 

对于简单的结构,您可以像使用memcpy一样使用memcpy也可以只使用memcpy

 RTCclk = RTCclkBuffert; 

编译器将创build代码来为您复制结构。


关于复制的一个重要的注意事项:这是一个浅拷贝,就像memcpy 。 这意味着如果你有例如一个包含指针的结构,它只是实际的指针将被复制,而不是它们指向的内容,所以在复制之后,你将有两个指针指向同一个内存。

你的代码是正确的。 你也可以直接指定另一个(见Joachim Pileborg的答案 )。

当你稍后来比较这两个结构时,你需要小心地比较结构,一次一个成员,而不是使用memcmp ; 看你如何比较结构C中的平等?

在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

你的memcpy代码是正确的。

我的猜测是你没有包含string.h。 所以编译器假定memcpy原型是错误的,因此是警告。

无论如何,你应该简单地分配结构(正如Joachim Pileborg指出的那样)。

memcpy希望前两个参数是void *。

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

PS虽然没有必要,但是会议规定了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; } 

我想你应该把指针(无效*)摆脱警告。

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

你也可以使用没有括号的sizeof,你可以在variables中使用它,但是如果RTCclk被定义为一个数组,sizeof将返回数组的全部大小。 如果你使用sizeof与types,你应该使用括号。

 sizeof(struct RTCclk)