【问题标题】:How to copy the content of a structure​ in another structure in C如何在C中将结构的内容复制到另一个结构中
【发布时间】:2017-07-19 18:24:25
【问题描述】:

我有一个 C 程序,其中有两个结构

struct one{
  int a;
  int b;
  char *s;
  int c;
};

struct two{
  int a;
  int e;
  char *s;
  int d;
};

是否可以编写一个函数,将具有相同类型和名称的变量的值从struct one 复制到struct two? 例如,在这种情况下,函数应该这样做

two.a = one.a;
two.s = one.s;

【问题讨论】:

  • 那是不正当的。
  • 如果 *pone 指向 1 并且 *ptwo 指向 2 那么 memcpy(one,two,sizeof(one)); 应该给它。
  • 所以你复制了一个指针而不是它指向的内容。假设你然后free 指针在第一个struct。注定失败。
  • 不是真的,不是自动的。典型的解决方法是将公共字段提取到父结构中,该结构可以嵌入到两个结构中并复制。或者,您可以通过半生不熟的内省来玩令人讨厌的游戏,以注册每个成员的姓名、偏移量和类型。然后编写一个函数来复制匹配的字段。或者使用代码生成对结构定义进行预处理,离线生成合适的复制代码。
  • free 只能与 malloc() 结合使用,这些是静态结构。

标签: c struct structure


【解决方案1】:

没有办法自动从结构中获取给定名称的字段。虽然您可以在 Java 中使用反射执行类似的操作,但在 C 中无法完成。您只需手动复制相关成员即可。

【讨论】:

    【解决方案2】:

    你可以这样写函数宏:

    #define CAT(A, B) A ## B
    #define ARGS_ASSIGN(N, L, R, ...) CAT(_ARGS_ASSIGN, N) (L, R, __VA_ARGS__)
    #define _ARGS_ASSIGN1(L, R, M0) L.M0 = R.M0;
    #define _ARGS_ASSIGN2(L, R, M0, M1) L.M0 = R.M0; L.M1 = R.M1;
    /* ... define sufficiently more */
    

    并以这种方式使用:

    ARGS_ASSIGN(2, two, one, a, s)
    

    【讨论】:

      【解决方案3】:

      理论上,如果您确定编译器按照类型定义中的顺序对结构进行排序,则可以使用下面的代码为上面的示例使用简单的块复制函数来执行此操作。但是,我认为这不是一个好主意。使用上面提出的答案之一中定义的相同类型的两个数据结构,块复制会更安全。

      使用块复制功能的示例:

      void main(void)
      {
      
          struct one{
              int a;
              int b;
              char *s;
              int c;
          };
      
          struct two{
              int a;
              int e;
              char *s;
              int d;
          };
      
          // Place code that assigns variable one here
      
          memcpy(&two, &one, sizeof(one));
      }
      

      【讨论】:

      • 为什么要重新实现memcpy
      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 2014-05-28
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      相关资源
      最近更新 更多