在C中将一个数据结构复制到另一个数据结构

时间:2013-08-01 10:13:29

标签: c struct

在以下代码中,我们可以将yy复制到xx吗?如果没有,还有另一种方式吗?我们必须使用指针或其他东西吗?

typedef unsigned int UINT32
typedef struct
{
    UINT32 a : 4; 
    UINT32 b: 2;      
    UINT32 c: 2;
    UINT32 d: 4;
    UINT32 e: 4;
    UINT32 f: 8; 
    UINT32 g: 8;
}Word;

Word *xx , *yy;
xx = yy;
xx->a = 1; 

4 个答案:

答案 0 :(得分:0)

当然,您可以为彼此分配一个结构。每个成员都将被复制。

在您的示例中,*xx = *yy相当于:

xx->a = yy->a;
xx->b = yy->b;
//...
xx->g = yy->g;

请注意,您必须将*yy中的*xx而不是指针yy复制到指针xx中。 另请注意,您没有初始化指针,也没有初始化结构。你应该去像

Word a, b;
b.a = ...;
b.b = ...;
...
b.g = ...;
Word* xx = &a;
Word* yy = &b;
*xx = *yy; //equivalent to a = b;

你必须注意包含指针的struct:在这种情况下复制指针的值,因此底层对象(如果有的话)是相同的。根据您的代码的semanthics,这可能是也可能不是您的意思。

答案 1 :(得分:0)

我会这样做:

#include <string.h>

Word A = { 4,2, 2,4,4,8,8};
Word B;
memcpy( &A, &B, sizeof(Word));

简单有效。

修改: 更简单的是:

Word A = { 4,2, 2,4,4,8,8};
Word B = A;

答案 2 :(得分:0)

您的代码复制指针,以便xxyy指向同一个对象。 如果您使用结构(而不​​是指针),则=运算符与使用memcpy

完全相同

这是复制后手表中的2个指针。注意相同的地址 Here is the 2 pointers in the watch after the copy. Notice the same address

答案 3 :(得分:0)

您可以尝试使用普通对象。数据无法在c中隐式初始化。必须创建一个对象,并且必须输入数据。

如果结构看起来像这样

typedef unsigned int UINT32;
struct Word{
  UINT32 a;
  UINT32 b;
  UINT32 c;
  UINT32 d;
 };

不使用指针:

Word xx , yy={0,1,2,3};
xx = yy;
xx.a = 10;
yy.b = 100; 
printf("%d -- %d -- %d -- %d",yy.a,yy.b,yy.c,yy.d); // 0 -- 100 -- 2 -- 3 
printf("%d -- %d -- %d -- %d",xx.a,xx.b,xx.c,xx.d); // 10 -- 1 -- 2 -- 3 

此处 xx yy 是为Word创建的不同对象。 yy 对象数据被复制到 xx 。对 xx 元素进行更改时,不会影响 yy 数据,因为两者都是不同的对象。

使用指针时:

 struct Word *xx;
 struct Word *yy=malloc(sizeof(struct Word));
 yy->a=0;
 yy->b=1;
 yy->c=2;
 yy->d=3;
 xx=yy;
 xx->a = 10;
 yy->b = 100; 
 printf("%d -- %d -- %d -- %d",yy->a,yy->b,yy->c,yy->d); // 10 -- 100 -- 2 -- 3 
 printf("%d -- %d -- %d -- %d",xx->a,xx->b,xx->c,xx->d); // 10 -- 100 -- 2 -- 3 

此处您已为 xx 分配内存并为其初始化数据。 xx yy 都指向相同的内存位置,因此更改 xx yy 中的数据都会影响两者。