0

我对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;
    }
}
4

3 回答 3

1

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

于 2012-12-05T08:04:42.923 回答
1

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

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

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

于 2012-12-05T08:05:32.627 回答
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;
}
于 2012-12-05T08:40:31.887 回答