2012-07-09 13 views
6

He querido aplicar el operador '&' único justo detrás de la función para operar en el valor de retorno de la función. Sin embargo, me sale un error en tiempo de compilación (yo uso gcc de MinGW)utilizando unario & operador en el valor de retorno de la función

test.c: In function 'main':

test.c:8:12: error: lvalue required as unary '&' operand

hice un código para hacer mi pregunta más fácil de entender:

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

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

int function1() 
{ 
    return 10; 
} 

void function2(int *param) 
{ 
    return; 
} 

Este código crea mismo error de tiempo de compilación .

¿Cómo puedo usar el operador '&' solo desde la función 2 "()", sin otro código en otro lugar?

+2

No se puede, siempre y cuando 'function1' devuelva un' int'. – AnT

Respuesta

11

Lo que se quiere se puede lograr en C99 y más tarde a través de:

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

es decir, hacer un compuesto literal que contiene el valor de retorno de la función.

+0

¡Esto es bastante inteligente! En esencia, crea una variable temporal "anónima" y la inicializa con el valor de retorno de la función1. – eresonance

10

No puede. El valor de retorno de una función es un valor pero no un objeto. No tiene una ubicación designada en la memoria ni una dirección, por lo que no puede tomar un puntero a ella. En su lugar podría escribir:

int a = function1(); 
function2(&a); 
3

El problema es que & toma la dirección de las variables. El valor de retorno de una función no necesariamente se almacena en la memoria. En otras palabras, no es un lvalue (no puede ponerlo en el lado izquierdo de =). Por lo tanto, no tiene sentido pedir su dirección (porque no existe).

Lo que debe hacer es la siguiente:

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

El estándar C11 define en 6.3.2.1 lvalue como:

An lvalue is an expression (with an object type other than void) that potentially designates an object; (footnote: The name ‘‘lvalue’’ comes originally from the assignment expression E1 = E2, in which the left operand E1 is required to be a (modifiable) lvalue. It is perhaps better considered as representing an object ‘‘locator value’’. What is sometimes called ‘‘rvalue’’ is in this International Standard described as the ‘‘value of an expression’’)

En la misma norma, en 6.5.3.2 que dice:

The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.

+0

Establecer "El valor de retorno de una función no se almacena necesariamente en una variable" es incorrecto, específicamente "no necesariamente". A menos que especifique una variable para el valor devuelto en el que se almacenará, NO se almacena. –

+0

@nathanwhite, tienes razón. Lo cambié a "memoria". – Shahbaz

2

No se puede obtener la dirección de un valor devuelto por una función.

¿Qué pasa si ese valor se transfiere a la persona que llama a través de un registro de la CPU?

La única forma de que function2() use el resultado de function1() es usar una variable intermedia, que tiene una dirección en la memoria.

main() 
{ 
    int a; 

    a = function1(); 
    function2(&a); 
} 
1

No puede hacer esto directamente. El valor de retorno de la función se puede almacenar en la pila (y pronto se sobrescribirá en otra llamada de función), o tal vez en los registros, etc. (dependiendo de la convención de llamadas).

Probablemente no desee acceder directamente a ninguno de esos lugares y ni siquiera tiene mucho sentido (bueno, tal vez a menos que sepa realmente lo que está haciendo).

El valor de retorno de una función con la que trabaja es un valor r (bueno ... simplemente un valor), mientras que el operador '&' necesita, como se ve en la salida del compilador, un lvalue (algo que puede asignar a). Ergo, simplemente almacene el valor de retorno en una variable (una variable local dentro de su 'main()', luego obtenga la dirección de la misma).

int main() { 
    int x = function1(); 
    function2(&x); 
} 
Cuestiones relacionadas