我一直在玩空指针,并创建了以下示例:
#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/