Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何复制结构的内容&x200B;在C中的另一个结构中_C_Struct_Structure - Fatal编程技术网

如何复制结构的内容&x200B;在C中的另一个结构中

如何复制结构的内容&x200B;在C中的另一个结构中,c,struct,structure,C,Struct,Structure,我有一个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; 无法从结构中自动获取给定名称的字段。虽然您可以在Ja

我有一个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;

无法从结构中自动获取给定名称的字段。虽然您可以在Java中使用反射执行类似的操作,它不能用C语言完成。你只需要手动复制相关的成员。

理论上,如果你确定你的编译器按照其类型定义中的顺序对结构进行排序,你可以使用下面的代码,通过上面例子中的一个简单的块复制函数来完成。然而,我认为这不是一个好主意。如果使用两个相同类型的数据结构(如上述一个答案中所定义),则块复制会更安全

使用块复制功能的示例:

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

您可以这样编写函数宏:

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

这是有悖常理的。如果*pone指向1,*ptwo指向2,那么memcpy(1,2,sizeof(1));应该指向它。所以你复制了一个指针,但不是它指向的。假设您随后
释放
第一个
结构中的指针。命中注定。不是真的,不是自动的。典型的解决方法是将公共字段提取到父结构中,父结构可以嵌入到两个结构中并进行复制。或者你可能会玩一些不成熟的自省游戏来记录每个成员的姓名、偏移量和类型。然后编写一个函数来复制匹配字段。或者使用代码生成来预处理结构定义并离线生成适当的复制代码。free只能与malloc()一起使用,这些是静态结构。为什么要重新实现
memcpy