Visibilidad en C
Un programa escrito en C no es más que una colección de subprogramas (funciones) en idéntico nivel, dentro del programa principal (Main). Estas funciones pueden llamarse entre sí, incluso de forma recursiva. Las variables locales definidas en una función son visibles sólo dentro de la función. En cambio las variables globales se definen fuera de la funciones (en la función Main) y pueden ser referenciadas desde cualquiera de ellas.
Las variables locales de una función se asignan dinámicamente, por ahora estudiaremos ahora los modos de direccionamiento más adecuados para satisfacer los requerimientos de los lenguajes de alto nivel. Estos modos reducirán al mínimo el número de instrucciones requeridas para acceder a los elementos de las diferentes estructuras de datos (array, record, etc.) que soportan estos lenguajes, es decir, para calcular sus direcciones efectivas. Estos lenguajes presentan una estructura de bloques e incorporan el concepto de visibilidad de las variables del programa, es decir, las reglas de acceso a las variables de cada uno de los bloques.
Es decir, cada vez que se activa la función. La asignación tiene lugar dentro de un registro de activación (RA) que se ubica en la pila asociada al programa. Dada la naturaleza recursiva de las llamadas, pueden existir en la pila más de un RA para la misma función (tantos como llamadas). Supongamos el siguiente perfil de progrma C:
Estructura de este programa sería la siguiente:
En la pila del programa se ubican los registros de activación correspondientes a cada una de estas llamadas, tal como se muestra en la siguiente figura, donde se ha sombreado las variables que pueden ser accedidas desde la tercera activación de la función fc: las globales y las locales a esta tercera llamada. Para realizar el acceso se dispone de sendos registros que apuntan a cada uno de estos RA, el Puntero al Registro de Activación Global (PRAG) y el Puntero al Registro de Activación Local (PRAL).
Fuente: Estructura de Computadores, Facultad de Informática, UCM