我一直在玩空指针,并创建了以下示例:

#include <stdio.h>

struct intint {
    int a;
    int b;
};

struct intshortshort {
    int a;
    short b;
    short c;
};

void fill_me(struct intint **pii, void *piss)
{
    (void*)*pii = piss;                // Question about this line?
}

int main()
{
    struct intint *pii = NULL;
    struct intshortshort iss;
    iss.a = iss.b = iss.c = 13;

    fill_me(&pii, &iss);

    printf("%d..%d\n", pii->a, pii->b);


    return 0;
}


题:

当我使用gcc版本2.95.4时,所有内容都会按预期进行编译和运行,但是gcc版本4.7.3给我以下错误:

void_pointer.c:16:17: error: lvalue required as left operand of assignment


是否有理由不再允许将(void *)添加到左值?

编辑:谢谢您的回答,我想我理解了这个问题,但是问题“为什么首先可以吗?”仍然很有趣。

最佳答案

这个问题与void*无关,与类型转换和左值有关。

例如:

#include <stdio.h>

int main()
{
    int n;
    (int)n = 100;
    return 0;
}


此代码将导致相同的错误:左值必须作为赋值的左操作数。

那是因为=运算符需要一个可修改的左值作为其左操作数。

那么,lvalue是什么? modifiable-lvalue是什么?请参阅wikipedia:Value

关于c - GCC 2.9和“需要左值作为赋值的左操作数”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20675646/

10-11 22:53