包含结构的动态数组,包含C中的联合

时间:2012-12-05 07:57:53

标签: c struct unions dynamic-arrays

我对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是我们在union中使用的结构的类型。 我如何浏览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;
    }
}

3 个答案:

答案 0 :(得分:1)

t_struct.obj[j].s_obj是联合,而不是实际结构。你必须使用t_struct.obj[j].s_obj.s1等。

答案 1 :(得分:1)

除非您需要每个结构的副本,否则请使用指针:

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

请注意,您还必须指定联合的元素。

答案 2 :(得分:1)

访问结构中包含的union成员时,一般语法是

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