【问题标题】:iterating through list : error lvalue required as left operand of assignment遍历列表:需要错误左值作为赋值的左操作数
【发布时间】:2011-07-20 10:48:38
【问题描述】:

我正在尝试解决此错误,但失败得很惨。我已经在下面声明了我的代码

msc_con_list_slot msc_slot;
memset(&msc_slot, 0, sizeof(msc_slot));
msc_pdn_con_t*conn = &msc_slot.conn;

msc_ber_list_slot bearer_slot;
memset(&bearer_slot, 0, sizeof(bearer_slot));
msc_ber_t *bearer = &bearer_slot.bearer;

并尝试迭代它

for(&bearer_slot=(&(conn->bearers))->head; &bearer_slot; &bearer_slot=(&bearer_slot)->next)
{
//asign value here 
}

我得到一个错误:
左值需要作为赋值的左操作数
警告:“bearer_slot”的地址将始终评估为“真”

也许我错过了一些东西,因为我真的不明白错误的实际含义是什么。谢谢你的帮助

编辑添加结构:

typedef struct {
        int id;
} msc_ber_t;

typedef struct _msc_ber_list_slot {
        msc_ber_t bearer;
        struct _msc_ber_list_slot *next, *prev;
} msc_ber_list_slot;

typedef struct {
        msc_ber_list_slot *head, *tail;
} msc_ber_list;

【问题讨论】:

    标签: c


    【解决方案1】:

    你不能这样做:

    &bearer_slot=(&(conn->bearers))->head;
    

    告诉我们msc_ber_list_slot是如何定义的。

    我想你想要这样的东西:

    struct msc_ber_list_slot *slot;
    for(slot=conn->bearers.head; slot; slot=slot->next)
    {
    //asign value here 
    }
    

    【讨论】:

    • 为什么我做不到?我编辑了结构,也尝试了你的建议,但它返回了'->'的无效类型参数的不同错误(有'msc_ber_list')@cnicutar
    • @heike msc_pdn_con_t 是如何定义的?
    【解决方案2】:

    在for循环中,你给&bearer_slot赋值,也就是变量bearer_slot的地址,这是不允许的(不是lvalue),没有意义。此外,您的循环条件是&bearer_slot 的值,它将始终评估为true(因为它是非NULL 指针),因此您的循环将永远运行。您将需要提供更多有关您希望此循环执行的操作的上下文。顺便说一句,(&x)->y 可以更简洁地写成x.y - 这将使您的代码更具可读性。

    【讨论】:

    • 感谢您的解释,但我还是无法得到“变量bearer_slot的地址,这是不允许的(它不是左值)并且没有意义”这句话@James
    • bearer_slot 是一个变量。您使用bearer_slot = whatever 设置它的值。 &bearer_slot 给你一个指针,告诉你bearer_slot 在内存中的存储位置。将变量物理位置的这种表示更改为另一个值是没有意义的。用技术术语来说,&bearer_slotrvalue,而不是 lvalue - 也就是说,您不能设置它的值。与x+1=y; 语句比较(其中xy 是整数) - 这是不允许的,因为x+1rvalue
    猜你喜欢
    • 2011-12-20
    • 2011-03-04
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多