C语言中无法对字面量1取地址?‘lvalue required’编译报错解析
为什么
&1编译失败? 编译报错lvalue required as unary ‘&’ operand的核心原因是:一元&运算符的操作数必须是左值,而字面量1是右值,没有可被取址的固定内存区域。
具体拆解:
- 左值是C语言里代表可寻址内存的表达式(比如变量名),它既可以被赋值,也能被取地址;而像
1这种字面量属于右值,本质只是一个临时的数值,没有绑定到固定的内存位置。 - 你误以为字面量会存在栈上,但编译器完全可以优化掉这个存储操作——比如调用
foo时直接把1放到寄存器里传递,根本不会在栈上分配空间;就算某些场景下字面量会被存入全局常量区,C标准也不允许对这类右值使用&取地址。 - 如果不想显式定义变量,可用C99支持的复合字面量实现需求:
foo(&(int){1});,复合字面量属于左值,会生成临时的int对象,允许取地址传递。
内容的提问来源于stack exchange,提问作者Ertugrul
相关产品推荐
相关产品推荐

