在 C 中将结构复制到结构

问题描述 投票:0回答:8

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

在头文件中:

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);
}
c struct copy microchip
8个回答
194
投票

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

memcpy
,或者只是从一个分配到另一个:

RTCclk = RTCclkBuffert;

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


关于复制的重要说明:这是浅复制,就像

memcpy
一样。这意味着如果您有例如包含指针的结构,只会复制实际的指针,而不是它们指向的内容,因此在复制之后,您将有两个指向同一内存的指针。


19
投票

您的代码是正确的。您也可以将一个直接分配给另一个(请参阅Joachim Pileborg 的回答)。

当您稍后比较这两个结构体时,您需要小心地长期比较结构体,一次一个成员,而不是使用

memcmp
;请参阅如何比较 C 中结构的相等性?


7
投票

要复制 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


2
投票

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

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;
}

2
投票

memcpy 期望前两个参数为 void*。

尝试:

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

附注尽管不是必需的,但惯例规定了 sizeof 运算符的括号。 在 C 语言中,你可能会犯很多导致代码无法维护的事情,因此遵循约定是一个优秀(可就业)C 程序员的标志。


1
投票

您的

memcpy
代码是正确的。

我的猜测是你缺少 string.h 的包含。因此编译器假设

memcpy
的原型是错误的,因此会出现警告。

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


1
投票

我认为你应该将指针转换为 (void *) 以消除警告。

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

您还可以使用不带括号的 sizeof ,您可以将其与变量一起使用,但如果 RTCclk 被定义为数组,则 sizeof 将返回数组的完整大小。如果您将 sizeof 与 type 一起使用,则应与括号一起使用。

sizeof(struct RTCclk)

0
投票

使用 memcpy 复制结构时,另一个问题是数据对齐。 如果全部都在一个文件中,则对齐方式应该相同。 我遇到了一个问题,声明位于不同的文件中并且具有不同的对齐方式。 确保对齐方式相同(变量以 1、2、4、8 字节的倍数开始)。 最好的解决方案是“打包”结构。 不幸的是,打包的格式因编译器而异。 一些变化: #pragma pack(push, 1) struct-def #pragma pack(pop) 或者 struct attribute((packed)) struct-def

© www.soinside.com 2019 - 2024. All rights reserved.