Criado por LUIS FERNANDO JUAREZ JIMENEZ
quase 9 anos atrás
|
||
Asignación dinámica de memoria • Por lo regular cuando se diseña un algoritmo, se debe conocer que elementos de entrada tendrá y cual será la salida, sin embargo, en algunas ocasiones no se sabe de forma exacta el numero de variables que requerirá nuestro algoritmo. • Por ejemplo, suponga que se van a registrar el numero de calificaciones de un conjunto de alumnos, para resolver este problema se podría utilizar una arreglo de calificaciones, sin embargo, si el numero de alumnos crece, nuestro programa ya no seria valido, puesto que no existen los recursos necesarios para almacenar todos los datos validos.Todos los programas definen variables que pueden ser definidas como globales y locales. • 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. También se pueden declarar variables estáticas locales que también se almacenan en segmentos fijos de memoria o en la memoria de datos • 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. • Sin embargo, no todas las veces es posible conocer el numero de variables con el que va a constar nuestro programa. C ofrece al desarrollador la opción de crear diferentes tipos de variables de forma dinámica, para crear tales variables se utilizan funciones como: malloc(), realloc(), calloc(), y free(). • Las regiones de memoria que reservan/liberan estas funciones son almacenadas en el montículo o heap. Memoria dinámica y su uso en C Algoritmia y programación estructurada (Main y código de funciones empleadas)Hasta el momento sólo se ha visto cómo el lenguaje C define y utiliza los punteros para acceder a las posiciones de memoria asignadas a un programa. Sin embargo, no se ha tratado cómo “conseguir” nuevas posiciones de memoria (ateniéndose al lenguaje de la parte algorítmica: cómo funciona el Módulo de Gestión de la Asignación Dinámica de C). En la están definidas las siguientes funciones: • void *calloc(size_t nobj, size_t size) calloc obtiene (reserva) espacio en memoria para alojar un vector (una colección) de nobj objetos, cada uno de ellos de tamaño size. Si no hay memoria disponible se devuelve NULL. El espacio reservado se inicializa a bytes de ceros. Obsérvese que calloc devuelve un (void *) y que para asignar la memoria que devuelve a un tipo Tipo_t hay que utilizar un operador de ahormado: (Tipo_T *)Función malloc() • 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() devuelve un apuntador 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• El prototipo de la función malloc() sería: void* = malloc( size_t bytes); • Donde: • void*: es el apuntador que almacenará la referencia o apuntara al bloque de memoria generado. • bytes: es el tamaño en bytes del bloque de memoria que se va a solicitar• 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.
Quer criar suas próprias Notas gratuitas com a GoConqr? Saiba mais.