2012-12-05 47 views
0

我对C很陌生,所以请耐心等待。 我有一个包含可变大小的其他结构的工会这样的结构:动态数组,结构中包含一个联合C

typedef struct _obj_struct { 
    struct_type type; 
    union obj { 
     struct1 s1; 
     struct2 s2; 
     struct3 s3; 
    } s_obj; 
} obj_struct; 

typedef struct _t_struct { 
    unsigned int number_of_obj; 
    obj_struct* objs; 
    other_struct os; 
    unsigned int loop; 
} t_struct; 

的struct_type是我们在联合使用结构类型。 我如何浏览objs中的所有元素? 这是做到这一点的正确方法:

struct1 s1; 
struct2 s2; 
struct3 s3; 

for (j=0; j<t_struct.number_of_obj; j++) 
{ 
    switch (t_struct.obj[j].type) { 
     case STRUCT1: 
      s1 = t_struct.objs[j].s_obj.s1; 
      break; 
     case STRUCT2: 
      s2 = t_struct.objs[j].s_obj.s2; 
      break; 
    } 
} 
+0

非常困惑:你必须定义'STRUCT1'和'STRUCT2'然后就可以使用 –

+0

你可能会需要有使用'S3 = t_struct.obj为STRUCT3的情况下, [j] .s_obj.s3;',据推测。 –

回答

1

除非你需要每个结构的复制,使用指针来代替:

struct1 *s1; 
// ... 
s1 = &t_struct.objs[j].s_obj.s1; 

请注意,您必须指定工会的元素为好。

1

t_struct.obj[j].s_obj是工会,而不是实际的结构。你必须使用t_struct.obj[j].s_obj.s1

+0

是的,当我复制代码时,我错位了。已经修复,谢谢。 – talon

1

当访问包含在结构内部工会成员,一般的语法是

structVariable.unionVariable.memberName 

你所访问是好的,如果你只是在末尾添加的成员名称的方式。所以,正确的版本是:

switch (t_struct.objs[j].type) { 
    case STRUCT1: 
     s1 = t_struct.objs[j].s_obj.s1; 
     break; 
    case STRUCT2: 
     s2 = t_struct.objs[j].s_obj.s2; 
     break; 
} 
相关问题