在C中将struct复制到struct

Chr*_*ian 61 c struct copy microchip

我想将一个相同的结构复制到另一个结构中,然后将其用作第一个结构的比较.问题是,当我这样做时,我的编译器给了我一个警告!我应该以其他方式做到这一点还是我做错了:

在标题文件中:

extern struct RTCclk
{
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t mday;
uint8_t month;
uint8_t year;
}
RTCclk;
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 134

对于简单的结构,您既可以memcpy像使用一样使用,也可以只从一个到另一个进行分配:

RTCclk = RTCclkBuffert;
Run Code Online (Sandbox Code Playgroud)

编译器将创建代码以便为您复制结构.


关于复制的一个重要注意事项:它是一个浅层副本,就像它一样memcpy.这意味着如果你有一个包含指针的结构,那么它只是被复制的实际指针而不是它们所指向的指针,因此在复制后你将有两个指向同一个内存的指针.

  • @User如果结构不包含任何指针,并且包含的​​结构不包含指针,依此类推,则需要注意.如果有指针在任何地方,你需要分配新的内存并使用例如`memcpy`进行复制. (3认同)
  • @User如果要复制列表,最简单的方法是从头开始创建列表.循环遍历现有列表并获取其数据,然后将其添加到新列表中. (3认同)
  • 即使我在struct中有数组,它也能工作吗?例如:struct example {int myThings [10000]; 字符名称[100]; int id; }; (2认同)

Gra*_*and 18

你的代码是正确的.您也可以直接将一个分配给另一个(参见Joachim Pileborg的答案).

当你后来比较两个结构时,你需要小心地比较结构,一次一个成员,而不是使用memcmp; 请参阅如何在C中比较结构的相等性?


Hem*_*lia 7

在c中复制结构,您只需按如下方式分配值:

struct RTCclk RTCclk1;
struct RTCclk RTCclkBuffert;

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

RTCclkBuffert=RTCclk1;
Run Code Online (Sandbox Code Playgroud)

现在 RTCclkBuffert.hour 的值为 5,

RTCclkBuffert.min 的值为 4

RTCclkBuffert.second 的值为 3