9
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

Revista U.F.T Estructura de Datos I

Embed Size (px)

DESCRIPTION

Todo Sobre memoria dinamica en C

Citation preview

Page 1: Revista U.F.T Estructura de Datos I

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

Page 2: Revista U.F.T Estructura de Datos I

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.

Page 3: Revista U.F.T Estructura de Datos I

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.

Page 4: Revista U.F.T Estructura de Datos I

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.

Page 5: Revista U.F.T Estructura de Datos I

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

Page 6: Revista U.F.T Estructura de Datos I

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

Page 7: Revista U.F.T Estructura de Datos I

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).

Page 8: Revista U.F.T Estructura de Datos I

CREAR

ACCESO

Page 9: Revista U.F.T Estructura de Datos I

LIBERAR