9

我想在函数后面应用一元“&”运算符来操作函数返回值。但是,我得到一个编译时错误(我使用 MinGW 的 gcc)

test.c:在函数'main'中:

test.c:8:12: error: lvalue required as unary '&' 操作数

我编写了一个代码以使我的问题更易于理解:

int function();
void function2(int *param);

main()
{
    function2(&function1());
}

int function1()
{
    return 10;
}

void function2(int *param)
{
    return;
}

此代码创建相同的编译时错误。

问题是:如何仅从 function2“()”中使用 '&' 运算符,而在其他地方没有其他代码?

4

5 回答 5

13

您想要的可以在 C99 及更高版本中通过以下方式实现:

function2((int[]){function1()});

即制作包含函数返回值的复合文字。

于 2012-07-09T15:41:55.883 回答
12

你不能。函数的返回值是一个值,而不是一个对象。它在内存中没有指定的位置,没有地址,因此您无法获取指向它的指针。相反,你可以写:

int a = function1();
function2(&a);
于 2012-07-09T15:07:41.590 回答
4

问题是&需要变量的地址。函数的返回值不一定存储在内存中。换句话说,它不是一个lvalue(你不能把它放在左边=)。因此,询问它的地址是没有意义的(因为它不存在)。

你应该做的是:

int result = function1();
function2(&result);

C11 标准lvalue在 6.3.2.1 中定义为:

左值是一个表达式(对象类型不是 void),它可能指定一个对象;(脚注:“左值”这个名称最初来自赋值表达式 E1 = E2,其中要求左操作数 E1 是(可修改的)左值。也许最好将其视为表示对象“定位器值” '。有时被称为''rvalue''的东西在本国际标准中被描述为''表达式的值'')

在同一标准中,在 6.5.3.2 中它说:

一元 & 运算符的操作数应为函数指示符、[] 或一元 * 运算符的结果,或指定不是位域且未使用寄存器存储类说明符声明的对象的左值.

于 2012-07-09T15:09:02.697 回答
3

您无法获取函数返回值的地址。

如果该值通过 CPU 寄存器传回给调用者怎么办?

使 function2() 使用 function1() 的结果的唯一方法是使用中间变量,该变量恰好在内存中具有地址。

main()
{
    int a;

    a = function1();
    function2(&a);
}
于 2012-07-09T15:10:00.643 回答
2

您不能直接执行此操作。函数返回值可能存储在堆栈中(很快会在另一个函数调用中被覆盖),或者可能存储在寄存器等中(取决于调用约定)。

您可能不想直接访问这些地方中的任何一个,而且它甚至没有多大意义(好吧,也许除非您真的知道自己在做什么)。

您使用的函数的返回值是一个右值(嗯......只是一个值),而正如您在编译器输出中看到的那样,“&”运算符需要一个左值(您可以分配给它的东西)。因此,只需将返回值存储在一个变量中('main()' 中的一个局部变量,然后获取它的地址)。

int main() {
    int x = function1();
    function2(&x);
}
于 2012-07-09T15:12:48.523 回答