【问题标题】:How do I pass a member of a union by reference如何通过引用传递工会成员
【发布时间】:2016-09-28 19:32:13
【问题描述】:

我有一个联合声明如下:

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] 不会解析到我正在寻找的地址吗?

【问题讨论】:

  • 什么是mpls_vpws_t?如果那不是数组 typedef,你显然不能使用Vpws_dat[lab]。也许你的意思是&ser_dat_ch[lab].Vpws_dat
  • @M.M 两个结构都是typedef struct
  • 说“C 不支持通过引用传递”就像说“C 不支持链表”
  • @M.M Olaf 实际上是对的 - 你可能会说,C 通过传递指针来模拟 PBR。实际上,它是一样的,除非它不是(你不能通过引用传递一个 array,因为它失去了它的数组特征)
  • 很好,谢谢。我什至很久以前就知道这一点,但显然决定忘记,因为您通常不会经常使用它。

标签: c pointers structure unions


【解决方案1】:

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

ser_dat_ch[i].Vpws_dat

指向该联合的指针是

&(ser_dat_ch[i])

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

&(ser_dat_ch[i].Vpws_dat)

【讨论】:

  • 感谢您的大开眼界!
【解决方案2】:

我无法对您的帖子发表评论(声誉不足)。您收到的错误通常暗示函数参数不是指针的正确类型。 IE。将单维指针传递给多维指针。

另外,你的语法有问题:

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*,因为我不确定内部实现是什么。

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多