Ingeniero

Páginas: 14 (3490 palabras) Publicado: 5 de marzo de 2013
Asignación dinámica de memoria

5.0 Introducción

En este tema estudiaremos las posibilidades que ofrece el
lenguaje C a la hora de trabajar dinámicamente con la memoria
dentro de nuestros programas, esto es, reservar y liberar bloques
de memoria dentro de un programa.

Además en este tema se introducirá el concepto de tipo
abstracto de dato y la forma dedividir un gran programa en otros
más pequeños.


5.1 Asignación dinámica y estática de memoria.

Hasta este momento solamente hemos realizado asignaciones
estáticas del programa, y más concretamente estas asignaciones
estáticas no eran otras que las declaraciones de variables en
nuestro programa. Cuando declaramos una variable se reserva la
memoria suficiente paracontener la información que debe
almacenar. Esta memoria permanece asignada a la variable hasta que
termine la ejecución del programa (función main). Realmente las
variables locales de las funciones se crean cuando éstas son
llamadas pero nosotros no tenemos control sobre esa memoria, el
compilador genera el código para esta operación automáticamente.
En este sentidolas variables locales están asociadas a
asignaciones de memoria dinámicas, puesto que se crean y destruyen
durante la ejecución del programa.

Así entendemos por asignaciones de memoria dinámica,
aquellas que son creadas por nuestro programa mientras se están
ejecutando y que por tanto, cuya gestión debe ser realizada por el
programador.

5.2 ¿Cómo se reservamemoria dinámicamente?

El lenguaje C dispone, como ya indicamos con anterioridad,
de una serie de librerías de funciones estándar. El fichero de
cabeceras stdlib.h contiene las declaraciones de dos funciones que
nos permiten reservar memoria, así como otra función que nos
permite liberarla.

5.2.1 Reserva de memoria

Las dos funciones que nos permiten reservarmemoria son:

malloc (cantidad_de_memoria);
calloc (número_de_elementos, tamaño_de_cada_elemento);

Estas dos funciones reservan la memoria especificada y nos
devuelven un puntero a la zona en cuestión. Si no se ha podido
reservar el tamaño de la memoria especificado devuelve un puntero
con el valor 0 o NULL. El tipo del puntero es, en principio void,
es decir,un puntero a cualquier cosa. Por tanto, a la hora de
ejecutar estás funciones es aconsejable realizar una operación
cast (de conversión de tipo) de cara a la utilización de la
aritmética de punteros a la que aludíamos anteriormente. Los
compiladores modernos suelen realizar esta conversión
automáticamente.

Antes de indicar como debenutilizarse las susodichas
funciones tenemos que comentar el operador sizeof. Este operador
es imprescindible a la hora de realizar programas portables, es
decir, programas que puedan ejecutarse en cualquier máquina que
disponga de un compilador de C.

El operador sizeof(tipo_de_dato), nos devuelve el tamaño
que ocupa en memoria un cierto tipo de dato, de esta manera,
podemosescribir programas independientes del tamaño de los datos
y de la longitud de palabra de la máquina. En resumen si no
utilizamos este operador en conjunción con las conversiones de
tipo cast probablemente nuestro programa sólo funciones en el
ordenador sobre el que lo hemos programado.

Por ejemplo, el los sistemas PC, la memoria está orientada
a bytes y unentero ocupa 2 posiciones de memoria, sin embargo
puede que en otro sistema la máquina esté orientada a palabras
(conjuntos de 2 bytes, aunque en general una máquina orientada a
palabras también puede acceder a bytes) y por tanto el tamaño de
un entero sería de 1 posición de memoria, suponiendo que ambas
máquinas definan la misma precisión para este tipo.

Con todo lo...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Ingeniero
  • Ingeniero
  • Ingeniero
  • Ingeniero
  • Ingeniero
  • Ingeniero
  • Ingeniero
  • Ingeniero

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS