2. Memoria Estática
• Suele estar alojada en el stack o pila es una zona
bastante limitada.
• Se utiliza para declarar variables de un tamaño que no
podemos modificar en la ejecución del programa.
• Procesa los datos más rápidos.
• En 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 generado, por lo cual
el proceso es muy eficiente.
3. Memoria Dinámica
La memoria dinámica esta alojada en el heap o
almacenamiento libre.
Se utiliza cuando el programador desconoce el número
de datos o elementos a tratar.
Su tamaño puede variar durante la ejecución del
programa.
Es muy lento a comparación con la m. estática, ya que
en el tiempo de ejecución es cuando determina la
memoria a usar.
Es más difícil de utilizar.
4. Tipos de funciones de la memoria
dinámica
Malloc
Calloc
Realloc
Free
5. Malloc
Reserva un bloque de memoria y devuelve un
puntero void al inicio de la misma.
Tiene la siguiente definición: void *malloc(size_t
size);
Donde el parámetro size especifica el número de
bytes a reservar.
6. Calloc
Funciona de modo similar a malloc, pero además de
reservar memoria, inicializa a 0 la memoria reservada. Se
usa comúnmente para arreglos y matrices.
Está definida de esta forma: void *calloc(size_t
nmemb, size_t size);
El parámetro nmemb indica el número de elementos a
reservar, y size el tamaño de cada elemento.
7. Realloc
Redimensiona el espacio asignado de forma dinámica
anteriormente a un puntero.
Tiene la siguiente definición: void *realloc(void *ptr, size_t size);
Donde ptr es el puntero a redimensionar, y size el nuevo
tamaño, en bytes, que tendrá. Si el puntero que se le pasa tiene
el valor nulo, esta función actúa como malloc. Si la reasignación
no se pudo hacer con éxito, devuelve un puntero nulo, dejando
intacto el puntero que se pasa por parámetro. Al usar realloc, se
debería usar un puntero temporal. De lo contrario, podríamos
tener una fuga de memoria, si es que ocurriera un error en
realloc.
8. Free
Sirve para liberar memoria que se asignó
dinámicamente.
Si el puntero es nulo, free no hace nada.
Tiene la siguiente definición: void free(void *ptr);
9. Tipos De Duración
Estática: las variables globales y las variables locales
declaradas con el especificador “static” tienen duración
estática. Se crean antes de que el programa inicie su
ejecución y se destruyen cuando el programa termina.
Automática: Se crean al entrar al bloque en el que fueron
declaradas y se destruyen al salir de ese bloque.
Asignada o Dinámica: Esta memoria se crea y se debe
liberar de forma explícita.
10. Apuntadores
Un apuntador es una variable que contiene la dirección de
memoria de otra variable. Se pueden tener apuntadores a
cualquier tipo de variable. Es importante mencionar que
sin el uso de los apuntadores en arreglos, estructuras y
funciones se dificultaría el trabajo a realizar, ya que el
mismo le ofrece flexibilidad y potencia.
11. Ventajas y Desventajas
Es la única forma de expresar algunos cálculos.
Se genera código compacto y eficiente.
Es una herramienta muy poderosa.
Cuando se emplean sin cuidado pueden crear
programas imposibles de entender.
12. Operadores de los Apuntadores
Unario o Monádico “&” devuelve la dirección de memoria de una variable.
main( )
{
int y;
int *yPtr;
y = 5;
yPtr = &y;
}
Indirección o Desreferencia “*” devuelve el contenido de un objeto apuntado por un
apuntador.
main()
{
int x,y;
int *py;
y = 5;
*py = y;
x = *py + 5;
printf(''%d %d nn'',*py,x);
}
13. Declarar un Apuntador
Al declarar una variable, el compilador reserva un espacio de
memoria para ella y asocia el nombre de esta a la dirección de
memoria.
Los apuntadores deben ser declarados como cualquier otra
variable antes de la ejecución.
Para declarar el apuntador se especifica el tipo de dato que se
apunta, el operador *, y el nombre del apuntador.
< Tipo de dato apuntado> * <identificador del apuntador>
Se asocia un apuntador a un tipo de dato, es por que se debe
conocer en cuantos bytes esta guardado el dato.
14. Referenciar un Apuntador
La referenciación es la obtención de la dirección
de una variable. En C y C++ esto se hace a través
del operador ‘&’, aplicado a la variable a la cual se
desea saber su dirección. Nótese que se trata de
un operador unario.
15. Apuntadores y Arreglos
El nombre de un arreglo es un índice a la dirección de comienzo
del arreglo. En esencia, el nombre de un arreglo es un puntero al
arreglo.
Una variable de tipo arreglo puede considerarse como un
apuntadora tipo del arreglo.
Los apuntadores pueden ser utilizados en cualquier operación que
involucre subíndices de arreglos.
Cuando se suma 1 a un apuntador el incremento se adecua al
tamaño en memoria del objeto apuntado.
Un apuntador es una variable, por lo que operaciones como pa = a
y pa++ son permitidas.
Un nombre de un arreglo es una constante, no una variable, de
ahí que a = pa o a++ o p = a.
16. Fallos comunes en funciones
No asignar un apuntador a una dirección de memoria antes de usarlo:
int *x
*x = 100;
Lo adecuado será, tener primeramente una localidad física de
memoria, digamos int y;
int *x, y;
x = &y;
*x = 100;
Indirección no válida:
Supongamos que se tiene una función llamada malloc() la cual trata de
asignar memoria dinámicamente (en tiempo de ejecución), la cual regresa
un apuntador al bloque de memoria requerida si se pudo o un apuntador
a nulo en otro caso.