在 C 中将 struct 复制到 struct

我想把一个相同的结构复制到另一个结构中,然后用它作为与第一个结构的比较。事情是,我的编译器给我一个警告,当我这样做!我应该用另一种方式做这件事,还是这样做是错误的:

在头文件:

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);
}
261132 次浏览

对于简单的结构,你可以像现在这样使用 memcpy,或者只是从一个结构分配到另一个结构:

RTCclk = RTCclkBuffert;

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


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

复制 c 中的结构你只需要把值赋值如下:

struct RTCclk RTCclk1;
struct RTCclk RTCclkBuffert;


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


RTCclkBuffert=RTCclk1;

现在 RTCclkBuffert.hour 的值为5,

分钟的值为4

Second 的值为3

您的代码是正确的。您还可以将其中一个直接分配给另一个(参见 Joachim Pileborg 的回答)。

稍后比较这两个结构时,需要小心比较这两个结构,一次一个成员,而不是使用 memcmp; 请参阅 如何比较 C 中的等式结构?

你的 memcpy编码是正确的。

我猜测您缺少一个 string.h 的包含。因此,编译器假定 memcpy的原型是错误的,因此会发出警告。

无论如何,为了简单起见,您应该只分配结构(正如 Joachim Pileborg 所指出的)。

也是一个很好的例子... ..。

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 * 。

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

附注: 虽然没有必要,但约定规定了 sizeof 运算符的括号。在 C 语言中,有很多代码是不可能维护的,因此遵循约定是一个好的(可雇佣的) C 程序员的标志。

我认为您应该将指针强制转换为(void *)以去除警告。

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

另外,还可以使用没有括号的 sizeof,可以将其用于变量,但是如果将 RTCclk 定义为数组,则 sizeof 将返回数组的全部大小。如果将 sizeof 与 type 一起使用,则应将其与括号一起使用。

sizeof(struct RTCclk)