Universidad Carlos III de Madrid

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2012 - Enero 2013

2. La pila y las variables locales

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?