|
|||||||
|
|
|
|||||
|
|
|||||||
.- Reservar y liberar memoria para tipos de datos simples (int,double,void..)
Sintaxis :
tipo *identificador = (tipo *) malloc(sizeof(tipo))
Ejemplo
int *ptr = (int *) malloc(sizeof(int));
double *f = (double *) malloc(sizeof(double));
void *malloc(size_t size)
Ya que ésta función retorna una dirección "sin tipo" o void , podemos hacer la conversión, anteponiendo (tipo *) a la función malloc.
Ejemplo
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *ptr = NULL;
ptr = malloc(sizeof(int)); /* origen del error */
*ptr = 4;
printf("\n Dir : %p , valor : %d ",ptr,*ptr);
free(ptr);
return 0;
}
Al compilar este programa, arrojará el error :
Cannot convert 'void *' to 'int *'
ya que no se hizo la conversión necesaria.
Algo que es muy válido hacer, es implementar una función que haga lo mismo.
Por ejemplo :
int *reserv_mem(void)
{
int *temp = NULL;
temp = (int *) malloc(sizeof(int));
return temp;
}
Por lo tanto una llamada a la función sería :
int *ptr = reserv_mem();
Para liberar memoria,simplemente se llama a la función free.
Ejemplo : free(ptr);
Programa de ejemplo
#include<stdio.h>
#include<stdlib.h>
int *reserv_mem(void);
int main()
{
int *ptr = reserv_mem();
printf("\n Reserva de memoria en direccion %p ",ptr);
printf("\n Ingrese valor : ");
scanf("%d",ptr);
printf("\n Valor ingresado : %d",*ptr);
free(ptr);
return 0;
}
int *reserv_mem(void)
{
int *temp = NULL;
temp = (int *) malloc(sizeof(int));
return temp;
}
.- Reservar y liberar memoria para tipos de datos estructurados
Ejemplo
typedef struct
{
int a;
double f;
char c;
} T_EST,*EST;
En el caso de declaración de T_EST que no es puntero, la sintaxis es la misma que para datos simples.
T_EST *e = (T_EST *) malloc(sizeof(T_EST));
En cambio cuando se declara un tipo de dato puntero a estructura, la sintaxis cambia a lo siguiente :
EST ptr = (EST) malloc(sizeof(T_EST));
Ejemplo de acceso a los campos de las variables e y ptr :
e->a = 5; e->f = 4.56; e->c = 'a'; ptr->a = 7; ptr->f = 2.78; ptr->c = 'b';
Al igual que para variables simples, se puede implementar una función de reserva de memoria.
EST reserv_mem()
{
EST temp = NULL;
temp = (EST) malloc(sizeof(T_EST));
return temp;
}
Para liberar memoria a una estructura de este tipo (campos simples), se usa la
función free().
Al aplicar esta función, la memoria reservada para los campos se
libera automáticamente.
Ejemplo
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int a;
double f;
char c;
} T_EST,*EST;
EST reserv_mem(void)
{
EST temp = NULL;
temp = (EST) malloc(sizeof(T_EST));
return temp;
}
int main()
{
EST t = reserv_mem();
printf("\n Dir t : %p",t);
/* salida : Dir t : 00780EA0 */
t->a = 5;
t->f = 3.5;
t->c = 'a';
printf("\n t->a = %d , t->f = %.1f , t->c = %c ",t->a,t->f,t->c);
/* salida : t->a = 5 , t->f = 3.5 , t-> c = a */
/* Declaración de tres punteros para guardar
las direcciones de los campos */
int *ptr = &(t->a);
double *ptr2 = &(t->f);
char *ptr3 = &(t->c);
printf("\n\n DIRECCIONES DE MEMORIA DE LOS CAMPOS ");
printf("\n t->a : %p \n t->f : %p \n t->c : %p",ptr,ptr2,ptr3);
/* Salida :
DIRECCIONES DE MEMORIA DE LOS CAMPOS
t->a : 00780EA0
t->f : 00780EA8
t->c : 00780EB0
*/
/* Cambio de valores a través de indirección de punteros */
*ptr = 10; /* t->a = 10; */
*ptr2 = 7.0; /* t->f = 7.0; */
*ptr3 = 'b'; /* t->c = 'b'; */
/*
*t = 10;
Aunque t = ptr = 00780EA0 --> no se permite conversión
*/
printf("\n t->a = %d , t->f = %.1f , t->c = %c ",t->a,t->f,t->c);
/* salida : t->a = 10 , t->f = 7.0 , t->c = b */
free(t);
printf("\n DESPUES DE LIBERAR LA VARIABLE : t");
printf("\n Dir t : %p",t); /* salida : Dir t : 00780EA0 */
printf("\n t->a = %d , t->f = %.1f , t->c = %c ",t->a,t->f,t->c);
/* salida : t->a = "cualquier cosa" , ídem t->f y t->c */
printf("\n t->a = %d , t->f = %.1f , t->c = %c ",*ptr,*ptr2,*ptr3);
/* salida : " la misma salida anterior " */
return 0;
}
Nota : este programa fue compilado, en Visual C++ de Microsoft.