Aínda que nos capítulos anteriores analizáronse as variables que manexa a linguaxe C e os tipos de datos correspondentes, non se analizaron algunhas características relativas ás variables, sendo as máis importantes a duración e o ámbito (scope). Combinando estas características distínguense os diferentes tipos de almacenamento de C: auto, static, extern e register.
Una variable fixa xorde ao comezo do programa e sobrevive até a finalización da execución do mesmo, invadindo constantemente o seu parte de memo. Pola contra, una variable automática está asociada a unha función ou bloque concreto do programa. Por tanto, esta función ou bloque só se creará cando comece a executarse e desaparecerá ao finalizar a execución do bloque. En consecuencia, una variable automática pode xerarse varias veces e si o bloque ou función correspondente á variable non se utiliza nunha execución, a variable non se xerará.
O anterior ten una gran influencia na inicialización, xa que mentres os fixos teñan una única inicialización, os automáticos se inicializarán cada vez que a función ou bloque se referencie externamente.
Como veremos máis adiante, as variables globais serán fixas e os locais serán automáticos.
O marco ou scope é o concepto correspondente ao programa fonte e representa o campo de coñecemento do nome dunha variable. Na linguaxe C distínguense catro tipos de áreas de coñecemento:
O ámbito da variable depende de onde se atope, aínda que o static pode cambiar as palabras crave.
Veremos algúns exemplos paira ilustrar o anterior:
a)
Estas dúas variables automáticas (denominadas i) son diferentes xa que teñen o ámbito do bloque.
Todo iso débese á localización das definicións, ao estar dentro da función a variable, salvo que se diga outra cousa, é automática e o seu campo é o de bloqueo.
b)
j)
Temos dúas variables denominadas, una global, outra externa (fixa) e outra local, incluída na función f1.
O tres primeiros resultados débense á execución da función f1 (a inicialización é Ø cando se define exclusivamente) e a última ao programa principal.
Nalgunhas linguaxes de alto nivel distínguense dous tipos de almacenamento: global e local. En C é posible combinar a duración e o ámbito das variables, obtendo diferentes tipos de almacenamento, tendo en conta a localización da definición da variable e o uso das palabras crave extern, static, auto e register.
Vexamos o significado dos seguintes indicadores:
extern:
cando se desexa utilizar una variable global fose do módulo no que está definida, realízase una nova estimación da variable, pero predefinido o indicador extern, indicando que a definición está noutro lugar.
static:
ten dobre función. Reduce a vista do programa ao ficheiro ás variables definidas externamente (globais). Cambia a duración dos definidos dentro das funcións a fixos.
auto:
adáptase a variables con marco de bloques pero definidas dentro das funcións. Dado que estas variables, se non se axustan a ningún indicador, adoptan as mesmas características que o auto indicador, este indicador practicamente nunca se utiliza.
register:
Este indicador só se pode utilizar con variables con vista bloque e a súa incidencia no tempo de execución é a localización da variable nun rexistro xeral. Isto permite axilizar a execución do programa adaptándoo a variables moi utilizadas.
Na figura 1 recóllese un resumo de todas as características.
Una vez analizadas todas as características, imos ver o uso que teñen os diferentes tipos de variables expostas. Podemos distinguir catro usos diferentes:
Na figura 2 pódese ver un exemplo no que o novo tipo de datos de pila que se define na mesma só é accesible externamente mediante as funcións push, pop e clear.
No módulo no que se utiliza una destas funcións farase una mención especificando o indicador extern. Por exemplo paira utilizar push: extern void push ( ).
As variables vistas até o momento son estáticas, é dicir, o compilador saberá a cantidade de memoria que ocupan e por tanto pode predicir a súa localización.
A memoria dinámica é interesante cando a lonxitude dos datos que manexamos é variable en función da execución. Os demostradores Pascalez son dinámicos, xa que son solicitados e liberados mediante as funcións new e dispose. En C existe un mecanismo de adquisición e liberación de memoria dinámica mediante as funcións de libraría malloc, calloc, realloc e free que se exporán no capítulo 11.