El funcionamiento de la pila es como un espacio de anotación temporal. Por ejemplo, cuando se invoca una función, sus variables temporales están activas sólo durante su ejecución. Cuando la función termina, esas variables ya no existen. No tiene lógica reservar un espacio en la memoria global para estas variables. En la pila, por tanto, se crean espacios para estas variables y se destruyen al acabar la función. Esta es la razón por la que si se quiere conservar algún valor que se obtiene en una función, se ha de almacenar en una variable global (que por tanto está almacenada en la zona global), manipularse a través de un puntero, o devolverse como resultado, que se traduce en que su valor se copia a otra variable.
Los parámetros de una función también se consideran variables locales. Su ámbito de validez es igual al de las variables locales de una función con la salvedad de que comienzan la ejecución con un valor inicial que viene dado por el código que realiza la llamada.
El mecanismo de paso de parámetros y devolución de
resultados de una función en C se puede ilustrar mediante las operaciones
que se realizan en la zona de la pila. Supongamos que existe una función
definida como int function(int a, int b)
, y que se llama
mediante la línea
result = function(3, x + y);
Cuando se ejecuta la llamada, se crea un nuevo espacio en la
pila en el que se almacenan los parámetros y las variables locales de la
función function
. Sobre el espacio creado para el primer
parámetro a
se copia el valor 3
. Análogamente,
sobre el espacio creado para el segundo parámetro se copia el valor
resultante de evaluar la expresión x + y
. Tras inicializar con
estos valores a los parámetros en la pila, la función pasa a
ejecutarse. Nótese que las variables x
e y
no son
necesariamente variables de la función, pero sí deben ser válidas en el
código que contiene llamada. La siguiente figura ilustra estas operaciones
en la pila.
A la vista del funcionamiento del paso de parámetros en C, explica por qué la siguiente función, aunque se pretende que intercambie los valores de dos variables, no lo consigue.
Llamada a función | Definición de función |
---|---|
... ... x = 10; y = 20; swap(x, y); printf("x = %d, y = %d\n", x, y); ... |
void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; return; } |
¿De qué forma redefinirías la función swap
para
que el intercambio de los valores de las variables sea visible fuera de la
función?