|
Criado por LUIS FERNANDO RUIZ GARCIA
mais de 8 anos atrás
|
|
El manejo de memoria dinámica es la base del poder del lenguaje C y le da la capacidad de crear programas complejos que emplean grandes cantidades de memoria y los maneja de manera eficiente. Existen aplicaciones que requieren de enormes cantidades de arreglos o datos por momentos breves en el funcionamiento del mismo, por lo que no es viable declarar de antemano a estas como variables, globales o locales de una función. Lo anterior implica emplear funciones de ANSIC que permiten reservar memoria de manera dinámica y ampliarla, reducirla o destruirla en tiempo de ejecución. El manejo de memoria dinámica es la base del poder del lenguaje C y le da la capacidad de crear programas complejos que emplean grandes cantidades de memoria Las variables globales y del programa principal (main) se almacenan en posiciones fijas de la memoria llamada memoria de datos. Las variables locales se almacenan en el segmento de memoria llamada pila y existen solo cuando se hace una invocación a la función que las declaro. Todas estas variables comparten una característica en común, se definen cuando se compila el programa. Esto significa que el compilador reserva espacio en memoria para almacenar los valores para estas variables.
Suponga que se van a registrar el número de calificaciones de un conjunto de alumnos, para resolver este problema se podría utilizar una arreglo de calificaciones, sin embargo, si el número de alumnos crece, nuestro programa ya no sería válido, puesto que no existen los recursos necesarios para almacenar todos los datos válidos. Para resolver este problema es necesario recurrir al uso de apuntadores y a la asignación dinámica de memoria. Una variable que es generada dinámicamente, se construye (por ejemplo con malloc) y se puede destruir en tiempo de ejecución (uso de free). -Función malloc ()Esta definida por la biblioteca stdlib.h malloc() es la forma más habitual de obtener bloques de memoria dinámica. La función genera o asigna un bloque de memoria que es el numero de bytes pasados como argumento. malloc() de vuelve una puntador void* al bloque de memoria asignado, por lo tanto, hay que realizar un cast al tipo de apuntador requerido, para hacer buen uso de la memoria o de los datos que se lleguen a almacenar en dicho bloque de memoria.La función sizeof se utiliza con mucha frecuencia para referirnos al tamaño de memoria que se va a generar por las funciones de memoria dinámica. Si no se conoce el tamaño de memoria que se quiere reservar al momento de diseñar un algoritmo, dicho tamaño se puede solicitar al usuario y generar el bloque de memoria en tiempo de ejecución. Un arreglo bidimensional en realidad es un arreglo cuyos elementos son arreglos. Si el nombre de un apuntador unidimensional es un apuntador sencillo, entonces, el nombre de un arreglo bidimensional será un apuntador a apuntadores sencillos. Para asignar memoria a un arreglo multidimensional, se indica cada dimensión del arreglo al igual que se declara un arreglo unidimensional. Uso de free () para liberar la memoria asignada dinámicamente Cuando se termina de utilizar un bloque de memoria previamente asignado por cualquier función de asignación dinámica de memoria, se debe liberar el espacio de memoria y dejarlo disponible para otros procesos, esto se realiza utilizando la función free (). El prototipo de la función free es: voidfree(void*ptr); -Función calloc() Calloc () es otra función que permite obtener memoria dinámica. Al igual que malloc () devuelve un apuntador void* que hace referencia al bloque de memoria generado o NULL si no existe memoria suficiente para generar el bloque solicitado, portal motivo, también es necesario realizar un cast a una puntador valido para manejar los datos que se van a almacenar. -Función realloc ()Realloc () es la tercera función para obtener memoria dinámica. También de vuelve una puntador void* que hace referencia al bloque de memoria por lo tanto es necesario realizar un cast a una puntador valido. A diferencia de malloc () y Calloc (), realloc () cambia el tamaño de un bloque de memoria asignado dinámicamente, es decir, toma como parámetro de entrada una puntador *ptr a esa memoria y de pendiendo de un segundo parámetro incrementará o reducirá el tamaño de dicho bloque de memoria.
Quer criar suas próprias Notas gratuitas com a GoConqr? Saiba mais.