|
|||||||
|
|
|
|||||
|
|
|||||||
Arreglos dinámicos para datos simples
En general , para crear este tipo de arreglos se usa la función calloc.
EjemploSimilar a la función malloc, con la diferencia que el primer parámetro de la función es el número de elementos del arreglo.
Cuando se libera memoria, todos los datos del arreglo se pierden.
free(arr) --> free(arr[0]) , free(arr[1]),...,free(arr[9]).
Arreglos dinámicos para estructuras
Para reservar memoria se aplica el mismo concepto anterior.
Para liberar memoria, se aplica la liberación de memoria de una estructura
según sus campos.
#include<stdlib.h>
#include<stdio.h>
typedef struct
{
int a,b;
double c;
} T_EST,*EST;
int main()
{
/* se reservan 3 elementos */
int *arr = (int *) calloc(3,sizeof(int));
/* se guarda la dirección del último elemento */
int *ptr = &arr[2];
/* equivalente a : arr[2] = 10 , *ptr = 10. */
*(arr + 2) = 10;
/* se libera memoria para el arreglo */
free(arr);
printf("En la direccion %p esta el dato %d",ptr,*ptr);
/* salida : En la dirección 00045 esta el dato "basura" */
/* Aplicado para un arreglo de estructura */
EST arr2 = (EST) calloc(3,sizeof(T_EST));
arr2[2].a = 2;
arr2[2].b = 3;
arr2[2].c = 2.67;
(arr2 + 1 )->a = 3;
ptr = &(arr2[2].a);
free(arr2);
printf("\n en la direccion %p esta el dato %d",ptr,*ptr);
/* salida : ... "dato basura" */
return 0;
}
Nota : este programa fue compilado, en Visual C++ de Microsoft.
Reasignación del número de elementos de un arreglo dinámico
Para incrementar o reducir , el número de elementos , se usa la función realloc.
Ejemplo
Se ha reservado memoria para un arreglo de 10.
Supongamos ahora que necesitamos aumentar el número de elementos a 100.
Esta función al igual que malloc y calloc retorna un puntero void, por lo tanto seguimos usando la conversión de tipo. Los parámetros de esta función, son el puntero previamente retornado por malloc o calloc y el nuevo número de elementos.
¿ Que pasa con los datos al cambiar de tamaño ?Si aumenta el tamaño de 10 a 20 ( por ejemplo ) , los 10 primeros elementos se conservan, y los restantes son nulos, o cero en el caso numérico. Al contrario, si disminuye, sólo se conservan los N primeros.
Lo que acabo de señalar, es relativo ,depende del compilador. En algunos, al aplicar realloc, todos los datos se pierden. En otros, sólo se aplica el concepto para datos simples, dejando fuera el tema de los arreglos dinámicos de estructuras.