如何通过引用传递union的成员

时间:2016-09-28 19:32:13

标签: c pointers structure unions

我有一个工会声明如下:

typedef union {
    mpls_vpls_t Vpls_dat; //typedef struct
    mpls_vpws_t Vpws_dat; //typedef struct
}ser_cache_t;

我为它分配内存:

ser_dat_ch = calloc(LABEL_T_CNT,sizeof(ser_cache_t));
if (ser_dat_ch == NULL)
    return ERROR;

虽然static ser_cache_t *ser_dat_ch = NULL;是全球性的。

现在我想用数据填充我的联合,因此我想将指针传递给一个函数,如:
rv = switch_mpls_vpws_data_get(lab, &ser_dat_ch->Vpws_dat[lab]);
但是编译器在这里尖叫:表达式必须具有指向对象类型的指针 为什么这样,&ser_dat_ch->Vpws_dat[lab]不会解析我正在寻找的地址?

2 个答案:

答案 0 :(得分:2)

我假设你有一个这样的联合数组和一个指向该内存开头的指针。然后,访问第i个元素的结构成员之一看起来像

ser_dat_ch[i].Vpws_dat

和指向该联合的指针是

&(ser_dat_ch[i])

和指向联合中某个结构的指针(显然是你正在寻找的)是

&(ser_dat_ch[i].Vpws_dat)

答案 1 :(得分:0)

我无法对你的帖子发表评论(声誉不够)。您获得的错误通常暗示函数参数不是指针的正确类型。即将单个维度指针传递给多维指针。

此外,您的语法存在问题:

rv = switch_mpls_vpws_data_get(lab, &ser_dat_ch->Vpws_dat[lab]);

&set_dat_ch->Vpws_dat[lab]语法混乱。说实话,我甚至不确定先评估Vpws_dat[lab]然后ser_dat_ch->再评估&。你应该简化一下(虽然通过括号你可以得到所需的效果)。传递内部结构ser_dat_ch->Vpws_dat并检索函数内部的变量,或者在函数执行之前执行以下操作:

int *var = ser_dat_ch->Vpws_dat

然后将var传递给函数。注意:我刚使用了int*,因为我不确定内部实现是什么。