我想将相同的结构复制到另一个结构中,然后将其用作与第一个结构的比较。问题是,当我这样做时,我的编译器会给我一个警告!我应该以其他方式做还是我做错了:
在头文件中:
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
,或者只是从一个分配到另一个:
RTCclk = RTCclkBuffert;
编译器将创建代码来为您复制结构。
关于复制的重要说明:这是浅复制,就像
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
也是一个很好的例子......
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 程序员的标志。
您的
memcpy
代码是正确的。
我的猜测是你缺少 string.h 的包含。因此编译器假设
memcpy
的原型是错误的,因此会出现警告。
无论如何,为了简单起见,您应该只分配结构(正如 Joachim Pileborg 指出的那样)。
我认为你应该将指针转换为 (void *) 以消除警告。
memcpy((void *)&RTCclk, (void *)&RTCclkBuffert, sizeof RTCclk);
您还可以使用不带括号的 sizeof ,您可以将其与变量一起使用,但如果 RTCclk 被定义为数组,则 sizeof 将返回数组的完整大小。如果您将 sizeof 与 type 一起使用,则应与括号一起使用。
sizeof(struct RTCclk)
使用 memcpy 复制结构时,另一个问题是数据对齐。 如果全部都在一个文件中,则对齐方式应该相同。 我遇到了一个问题,声明位于不同的文件中并且具有不同的对齐方式。 确保对齐方式相同(变量以 1、2、4、8 字节的倍数开始)。 最好的解决方案是“打包”结构。 不幸的是,打包的格式因编译器而异。 一些变化: #pragma pack(push, 1) struct-def #pragma pack(pop) 或者 struct attribute((packed)) struct-def