revista u.f.t estructura de datos i
DESCRIPTION
Todo Sobre memoria dinamica en CTRANSCRIPT
E STRUCTURA DE DATOS I
Memoria Dinámica
C + + — JAVA — VISUAL BASIC — VISIO — C# — Eiffel
Puntero
Variable puntero
Funciones para crear y liberar espacio en
memoria dinámica en lenguaje C
Funcionamiento de la memoria dinámica
Memorias
Cabudare, febrero 2013
Todo sobre
memoria dinámica
Necesidades de la aplicación y del sistema...
EditorialEditorial Es importante saber que los tipos de da-
tos, tanto simples como estructurados,
vistos hasta ahora en los temas anteriores
de las asignaturas de Introducción a los
Computadores (IC) y Elementos de Pro-
gramación (EP), sirven para describir da-
tos o estructuras de datos cuyos tamaños
y forma se conocen de antemano. Sin em-
bargo, en muchos programas es necesario
que las estructuras de datos estén diseña-
das de manera que su tamaño y forma
varíe a lo largo de la ejecución de aque-
llos. Con esto se consigue, fundamental-
mente, que estos programas funcionen de
manera más eficiente y con un aprove-
chamiento óptimo de los recursos de al-
macenamiento en memoria principal.
Las variables de todos los tipos de datos
vistos hasta el momento son denominadas
variables estáticas, en el sentido en que se
declaran en el programa, se designan por
medio del identificador declarado, y se
reserva para ellas un espacio en memoria
en tiempo de compilación de los progra-
mas.
Sin embargo, son muchos los lenguajes
de programación que ofrecen la posibili-
dad de crear y destruir variables en tiem-
po de ejecución, de manera dinámica, a
medida que van siendo necesitadas duran-
te la ejecución del programa. Puesto que
estas variables no son declaradas explíci-
tamente en el programa y no tienen iden-
tificador (nombre) asignado, se denomi-
nan variables anónimas. El pseudolengua-
je utilizado en las asignaturas de IC y EP
permite el uso de este tipo de variables.
Para ello, ofrece los mecanismos y la sin-
taxis necesaria para su creación, a la vez
que proporcionará una manera de referir-
se a estas variables para el acceso a los
datos que contienen y la asignación de
valores a los mismos. Todo esto se lleva a
cabo mediante el empleo del tipo puntero,
cuyas características se expondrán en los
siguientes apartados.
Créditos
Editorial U.F.T
Autores/Editores/Diseño/Redacción:
Angelo Berardinelli.
Luis Bracamonte.
MEMORIA DINAMICA
La memoria dinámica se refiere a aquella
memoria que no puede ser definida ya que
no se conoce o no se tiene idea del número
de la variable a considerarse, la solución a
este problema es la memoria dinámica que
permite solicitar memoria en tiempo de eje-
cución, por lo que cuanta más memoria se
necesite, más se solicita al sistema operati-
vo. El sistema operativo maneja la memoria
gracias al uso de punteros, por la misma na-
turaleza del proceso nos impide conocer el
tamaño de la memoria necesaria en el mo-
mento de compilar.
Datos dinámicos: su tamaño y
forma es variable (o puede serlo) a
lo largo de un programa, por lo
que se crean y destruyen en tiem-
po de ejecución. Esto permite di-
mensionar la estructura de datos
de una forma precisa: se va asig-
nando memoria en tiempo de eje-
cución según se va necesitando.
Una ventaja de la memoria dinámica es que se pue-
de ir incrementando durante la ejecución del progra-
ma. Esto permite, por ejemplo, trabajar con arreglos
dinámicos. Aunque en C, a partir del estándar C99
se permite la creación de arreglos cuyo tamaño se
determina en tiempo de ejecución, no todos los
compiladores implementan este estándar. Además,
se sigue teniendo la limitante de que su tamaño no
puede cambiar una vez que se especifica, cosa que
sí se puede lograr asignando memoria de forma di-
námica.
Una desventaja de la memoria dinámica es que es
más difícil de manejar. La memoria estática tiene
una duración fija, que se reserva y libera de forma
automática. En contraste, la memoria dinámica se
reserva de forma explícita y continúa existiendo
hasta que sea liberada, generalmente por parte del
programador.
La memoria dinámica puede afectar el rendimiento.
Puesto que con la memoria estática el tamaño de las
variables se conoce en tiempo de compilación, esta
información está incluida en el código objeto gene-
rado, por lo cual el proceso es muy eficiente. Cuan-
do se reserva memoria de manera dinámica, se tie-
nen que llevar a cabo varias tareas, como buscar un
bloque de memoria libre y almacenar la posición y
tamaño de la memoria asignada, de manera que
pueda ser liberada más adelante. Todo esto repre-
senta una carga adicional, aunque esto depende de
la implementación y hay técnicas para reducir su
impacto.
PUNTERO
Un puntero o apuntador es una variable
que da referencia a una región de me-
moria; en otras palabras es una variable
cuyo valor es una dirección de memo-
ria. Si se tiene una variable ' p ' de tipo
puntero que contiene una dirección de
memoria en la que se encuentra alma-
cenado un valor ' v ' se dice que ' p '
apunta a ' v '. El programador utilizará
punteros para guardar datos en memo-
ria en muchas ocasiones, de la forma
que se describe a continuación.
Los punteros son de amplia utilización en programación y muchos lenguajes permiten la
manipulación directa o indirecta de los mismos. La principal razón de ser de los punte-
ros es la de manejar datos alojados en la zona de memoria dinámica o heap (aunque
también se pueden manipular objetos en la zona estática), bien sean datos elementales,
estructuras (struct en C) u objetos pertenecientes a una clase (en lenguajes Orientados a
Objetos). Gracias a esta propiedad, los punteros permiten modelar un grafo, en donde
La siguiente figura muestra tres variables, de tipos char, int y double, y un puntero a ca-
da una de ellas:
Un puntero es una variable cuyo
valor es la dirección de memoria
de otra variable.
Esquema de memoria
con punteros
Las variables tipo puntero deben apuntar al tipo de dato correcto. Si
no es así, pueden producirse resultados inesperados. Por ejemplo:
Una variable es un contenedor
que almacena un dato de cierto
tipo (los cuales son expuestos a
respectivos cambios durante un
programa). Al declarar una va-
riable, el compilador se preocu-
pa de reservar una cierta canti-
dad de memoria para trabajar
este. En maquinas de 32 bits el
valor de un entero es de 4 by-
tes, mientras que en una de 16
bits el entero vale 2 bytes.
(Ojo, que la mayoría de los ta-
rros que tengas a tu disposición
van a ser 32 bits).
CREAR
ACCESO
LIBERAR