79

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

在头文件中:

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

7 回答 7

173

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

RTCclk = RTCclkBuffert;

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


关于复制的一个重要说明:这是一个浅拷贝,就像memcpy. 这意味着,如果您有一个包含指针的结构,那么只有实际的指针将被复制,而不是它们指向的内容,因此在复制之后您将有两个指向同一内存的指针。

于 2012-02-03T10:43:02.857 回答
18

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

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

于 2012-02-03T10:47:57.270 回答
4

在 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

于 2012-02-03T10:46:04.413 回答
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;
}
于 2013-10-03T02:46:56.223 回答
1

你的memcpy代码是正确的。

我的猜测是您缺少 string.h 的包含。所以编译器假设一个错误的原型memcpy并因此产生警告。

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

于 2012-02-03T11:22:12.917 回答
1

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

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

PS 虽然不是必需的,但约定规定了 sizeof 运算符的括号。您可以在 C 语言中摆脱很多无法维护的代码,因此遵循约定是优秀(可雇用)C 程序员的标志。

于 2015-01-12T18:44:07.570 回答
0

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

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

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

sizeof(struct RTCclk)
于 2016-01-19T11:44:42.060 回答