【问题标题】:Copying of one data structure to another in C [duplicate]在C中将一个数据结构复制到另一个[重复]
【发布时间】:2013-08-01 10:13:29
【问题描述】:

在下面的代码中,我们可以将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; 

【问题讨论】:

  • 你试过这段代码了吗?
  • 如果我尝试给 xx->a = 1;在下一条指令中,我无法运行代码..
  • 可以,因为xx没有分配。
  • 请阅读动态内存分配,然后回来!
  • 如果你使用Word xx, yy; (即局部变量,不是动态分配的)然后你可以分配 xx = yy 并且你可以设置例如xx.a = 1

标签: c struct


【解决方案1】:

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

这是复制后手表中的2个指针。注意相同的地址

【讨论】:

    【解决方案2】:

    我会这样做:

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

    【讨论】:

    • 你为什么要做memcpy,而你可以简单地B = A
    • 没错,我会更新
    【解决方案3】:

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

    在您的示例中,*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;
    

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

    【讨论】:

    • 如果我尝试给 xx->a = 1;在下一条指令中,我无法运行代码..
    • 如果我尝试给 xx->a = 1;在下一条指令中,我无法运行代码..
    • #include #include 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 克:8; }单词;字 *xx , *yy; int main() { xx = yy; xx->a = 1; printf("%d",xx->a);返回0; }-- 我无法运行这段代码
    • xxyy是指针,所以.是错误的,应该用-&gt;代替。
    • @alk,我只是为了更正它而进行编辑,我一开始没有注意到它。感谢您指出。
    【解决方案4】:

    您可以尝试使用普通对象。数据不能在 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 
    

    这里 xxyy 是为 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 分配了内存并为其初始化了数据。 xxyy 都指向同一个内存位置,因此更改 xxyy 中的数据都会影响两者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多