2013-12-19 51 views
2

我一直空指针玩弄并创造了这个例子:GCC 2.9和“左值要求作为分配的左操作数”

#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 

是否有一个原因,添加(无效*)到左值是不允许的了吗?

编辑:谢谢你的回答,我想我明白了这个问题,但是问题“为什么它一开始就没问题?”仍然很有趣。

+2

铸造的结果是不是左值,除非它是一个参考。例如,http://coliru.stacked-crooked.com/a/61ba4d86f65eaa3e – chris

+0

@chris不,铸造的结果不是左值。你可能会想到另一种编程语言。 –

+0

@PascalCuoq,原谅我,当我发表评论时,我认为这被标记为C++。我很确定我只是疯了。 – chris

回答

0

不能在C.

赋值运算符的左操作数使用类型转换操作
2

它不出于同样的原因上班为什么

int x, y; 
    (int)x = y; 

不起作用。演员的结果不是一个“左值”,它不包含可以在其中存储内容的内存位置。而是将(int)x的结果视为临时的不可见变量,它只在执行此操作期间存在。

3

这个问题不是关于void*,是关于类型转换和左值。

例如:

#include <stdio.h> 

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

这个代码将导致相同的错误:左值需要作为分配的左操作数。

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

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

0

关键是要转换为void**,然后间接引用它:

void fill_me(struct intint **pii, void*piss) 
{ 
     *(void **)pii=piss; 
} 

输出,如预期:

13..851981 

13 is obvious 
851,981 - 13 = 851,968 
851,968/(256*256) = 13 
there are the 2 shorts as an int 
+0

@GintsDev这是你正在尝试做什么? –

+0

感谢您的回答,但我更期待为什么早期的gcc版本没有错误。 – GintsDev

+0

@GintsDev不清楚,如果你想要的东西工作,或想知道什么改变,反正这将工作:) –

相关问题