Lenguaje de programación C (IX). Características de las variables
1991/11/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
Si bien en los capítulos anteriores se han analizado las variables que maneja el lenguaje C y los tipos de datos correspondientes, no se han analizado algunas características relativas a las variables, siendo las más importantes la duración y el ámbito (scope). Combinando estas características se distinguen los diferentes tipos de almacenamiento de C: auto, static, extern y register.
Duración: Fijos vs Automáticos
Una variable fija surge al inicio del programa y sobrevive hasta la finalización de la ejecución del mismo, invadiendo constantemente su parte de memo. Por el contrario, una variable automática está asociada a una función o bloque concreto del programa. Por lo tanto, esta función o bloque sólo se creará cuando comience a ejecutarse y desaparecerá al finalizar la ejecución del bloque. En consecuencia, una variable automática puede generarse varias veces y si el bloque o función correspondiente a la variable no se utiliza en una ejecución, la variable no se generará.
Lo anterior tiene una gran influencia en la inicialización, ya que mientras los fijos tengan una única inicialización, los automáticos se inicializarán cada vez que la función o bloque se referencie externamente.
Como veremos más adelante, las variables globales serán fijas y los locales serán automáticos.
Ámbito
El marco o scope es el concepto correspondiente al programa fuente y representa el campo de conocimiento del nombre de una variable. En el lenguaje C se distinguen cuatro tipos de áreas de conocimiento:
- de programa: el nombre de la variable es global, por lo que puede referirse a cualquier función, bloque u orden.
- del fichero: sólo se conoce en el fichero fuente en el que se define el nombre de la variable. Por lo tanto, cuando se utiliza compilación distribuida, si se hace referencia desde otro módulo no se reconocerá, ya que el compilador lo tomará como otra variable.
- de la función: el nombre de la variable sólo se conoce en la propia función o subprograma.
- el del bloqueo: un bloque es el que se encuentra entre las mismas y las correspondientes} y sólo se conoce en el bloque en el que se define la variable.
El ámbito de la variable depende de donde se encuentre, aunque el static puede cambiar las palabras clave.
Veremos algunos ejemplos para ilustrar lo anterior:
a)
Estas dos variables automáticas (denominadas i) son diferentes ya que tienen el ámbito del bloque.
Todo ello se debe a la localización de las definiciones, al estar dentro de la función la variable, salvo que se diga otra cosa, es automática y su campo es el de bloqueo.
b)
![](images/A53031-a.jpg)
j)
Tenemos dos variables denominadas, una global, otra externa (fija) y otra local, incluida en la función f1.
![](images/A53031-c.jpg)
Los tres primeros resultados se deben a la ejecución de la función f1 (la inicialización es Ø cuando se define exclusivamente) y la última al programa principal.
Tipos de almacenamiento
En algunos lenguajes de alto nivel se distinguen dos tipos de almacenamiento: global y local. En C es posible combinar la duración y el ámbito de las variables, obteniendo diferentes tipos de almacenamiento, teniendo en cuenta la ubicación de la definición de la variable y el uso de las palabras clave extern, static, auto y register.
Veamos el significado de los siguientes indicadores:
extern:
cuando se desea utilizar una variable global fuera del módulo en el que está definida, se realiza una nueva estimación de la variable, pero predefinido el indicador extern, indicando que la definición está en otro lugar.
static:
tiene doble función. Reduce la vista del programa al fichero a las variables definidas externamente (globales). Cambia la duración de los definidos dentro de las funciones a fijos.
auto:
se adapta a variables con marco de bloques pero definidas dentro de las funciones. Dado que estas variables, si no se ajustan a ningún indicador, adoptan las mismas características que el auto indicador, este indicador prácticamente nunca se utiliza.
register:
Este indicador sólo se puede utilizar con variables con vista bloque y su incidencia en el tiempo de ejecución es la ubicación de la variable en un registro general. Esto permite agilizar la ejecución del programa adaptándolo a variables muy utilizadas.
En la figura 1 se recoge un resumen de todas las características.
![](images/A53031-b.jpg)
Uso
Una vez analizadas todas las características, vamos a ver el uso que tienen los diferentes tipos de variables expuestas. Podemos distinguir cuatro usos diferentes:
- variables locales automáticas: son las más utilizadas, ya que tienen el campo del bloque y la duración automática. La definición se realiza dentro de las funciones, sin ningún indicador o con un register indicador.
- variable local fija: si una variable que se utiliza en una sola función o bloque necesita mantener su valor, de una llamada a otra, será de este tipo. La definición se realiza igual que la anterior pero utilizando la palabra clave static.
- variable global simple: se caracteriza por conocer y mantener el valor desde diferentes funciones o bloques. A la hora de definir no se debe colocar ningún indicador, pero se definen separadamente de las funciones. No obstante, cuando deban ser referenciados desde otro módulo o fichero, se deberá hacer referencia a la variable especificando el indicador extern. La mayor parte de las funciones (ya que se adapta a un tipo de función) son normalmente de este tipo.
- variable global aislada: a la hora de definir nuevos tipos de datos resulta muy interesante que la variable sea captable de las funciones existentes en el módulo que define el tipo de dato, pero no de otros módulos. La duración es fija y el ámbito del fichero es muy interesante. La definición se realiza igual que la anterior pero anteponiendo el indicador static.
![](images/A53031-d.jpg)
En la figura 2 se puede ver un ejemplo en el que el nuevo tipo de datos de pila que se define en la misma sólo es accesible externamente mediante las funciones push, pop y clear.
En el módulo en el que se utiliza una de estas funciones se hará una mención especificando el indicador extern. Por ejemplo para utilizar push: extern void push ( ).
Memoria dinámica
Las variables vistas hasta el momento son estáticas, es decir, el compilador sabrá la cantidad de memoria que ocupan y por tanto puede predecir su ubicación.
La memoria dinámica es interesante cuando la longitud de los datos que manejamos es variable en función de la ejecución. Los demostradores Pascalez son dinámicos, ya que son solicitados y liberados mediante las funciones new y dispose. En C existe un mecanismo de adquisición y liberación de memoria dinámica mediante las funciones de librería malloc, calloc, realloc y free que se expondrán en el capítulo 11.
![](https://elia.eus/static/elhuyar/img/elia_RGB.png)
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia