2017-07-19 198 views
0

我有一个C程序中,我有两个结构如何将结构的内容复制到另一个结构用C

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

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

可以编写一个函数,用相同的拷贝变量的值类型和名称从struct onestruct two? 例如,在这种情况下,函数应该这样做

two.a = one.a; 
two.s = one.s; 
+3

这仅仅是不正当的。 –

+1

如果** pone *指向一个,** ptwo *指向两个然后* memcpy(one,two,sizeof(one)); *对它应该。 –

+0

所以你复制一个指针,但不是它指向的内容。假设你在第一个'struct'中释放指针。在劫难逃。 –

回答

-1

好吧,如果你定义一个类型结构,如:

typedef struct 
{ 
int a; 
int b; 
char *s; 
int c; 
} Tstruct; 

然后进行2个变量(类型Tstruct):

Tstruct one; 
Tstruct two; 

这里既然结构是同一类型,你可以很容易做到:

one=two; 

所有的结构两个值将被转移到一个结构完全一样,如果你做的事:

one.a=two.a; 
one.b=two.b; 
... 
+0

相同的功能,定义该结构类型,完全像上面,并在函数中你会像: void StructSwitch(Tstruct struct_one,Tstruct struct_two) struct_one.a = struct_two.a; ... } – Terrexo

+0

我不能,导致结构也有不同的变量 –

+0

请阅读问题。 OP只想复制那些共享相同名字的两个类似'struct'的成员。 –

2

有没有办法从结构自动抓取特定名称的领域。虽然你可以用Java做反射这样的事情,但它不能在C中完成。你只需要手动复制相关的成员。

0

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

示例使用块拷贝功能:

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

为什么要重新执行'memcpy'? –

0

您可以编写函数宏是这样的:

#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) 
相关问题