在C中将struct复制到struct

时间:2012-02-03 10:36:59

标签: 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;

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

6 个答案:

答案 0 :(得分:124)

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

RTCclk = RTCclkBuffert;

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


关于复制的一个重要说明:它是一个浅表副本,就像memcpy一样。这意味着如果你有例如一个包含指针的结构,它只是要复制的实际指针,而不是它们所指向的指针,因此在复制后你将有两个指针指向同一个内存。

答案 1 :(得分:18)

您的代码是正确的。您也可以直接将一个分配给另一个(参见Joachim Pileborg's answer)。

当你后来比较两个结构时,你需要小心地比较结构,一次一个成员,而不是memcmp;见How do you compare structs for equality in C?

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您的memcpy代码是正确的。

我的猜测是你缺少string.h的包含。因此,编译器假设memcpy的原型错误,因此警告。

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

我认为你应该将指针强加给(void *)以消除警告。

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

此外,您使用sizeof而不使用括号,您可以将其与变量一起使用,但如果将RTCclk定义为数组,则sizeof将返回数组的完整大小。如果你使用sizeof类型,你应该使用括号。

sizeof(struct RTCclk)