jueves, 31 de marzo de 2011
Malloc,Calloc,Sizeof,Realloc,Free.
'Malloc' 'Sizeof ' 'Free'
Uso de malloc, sizeof y free La función
malloc
es empleada comúnmente para intentar ``tomar'' una porción contigua de memoria. Esta definida como: void *malloc(size_t size);Lo anterior indica que regresará un apuntador del tipo
void *
, el cual es el inicio en memoria de la porción reservada de tamaño size
. Si no puede reservar esa cantidad de memoria la función regresa un apuntador nulo o NULL
Dado que
void *
es regresado, C asume que el apuntador puede ser convertido a cualquier tipo. El tipo de argumento size_t
esta definido en la cabecera stddef.h
y es un tipo entero sin signo. Por lo tanto:
char *cp; cp = (char *) malloc(100);intenta obtener 100 bytes y asignarlos a la dirección de inicio a
cp
. Es usual usar la función
sizeof()
para indicar el número de bytes, por ejemplo: int *ip; ip = (int *) malloc(100 * sizeof(int) );El compilador de C requiere hacer una conversión del tipo. La forma de lograr la coerción (cast) es usando
(char *)
y (int *)
, que permite convertir un apuntador void
a un apuntador tipo char e int respectivamente. Hacer la conversión al tipo de apuntador correcto asegura que la aritmética con el apuntador funcionará de forma correcta. Es una buena práctica usar
sizeof()
aún si se conoce el tamaño actual del dato que se requiere, -- ya que de esta forma el código se hace independiente del dispositivo (portabilidad). La función
sizeof()
puede ser usada para encontrar el tamaño de cualquier tipo de dato, variable o estructura. Simplemente se debe proporcionar uno de los anteriores como argumento a la función. Por lo tanto:
int i; struct COORD {float x,y,z}; struct COORD *pt; sizeof(int), sizeof(i), sizeof(struct COORD) y sizeof(PT) son tambien sentencias correctas.En el siguiente ejemplo se reserva memoria para la variable
ip
, en donde se emplea la relación que existe entre apuntadores y arreglos, para manejar la memoria reservada como un arreglo. Por ejemplo, se pueden hacer cosas como: main() { int *ip, i; ip = (int *) malloc(100 * sizeof(int) ); ip[0] = 1000; for (i=0; i<100; ++i) scanf("%d",ip++); }Cuando se ha terminado de usar una porción de memoria siempre se deberá liberar usando la función
free()
. Esta función permite que la memoria liberada este disponible nuevemente quizás para otra llamada de la función malloc()
La función
free()
toma un apuntador como un argumento y libera la memoria a la cual el apuntador hace referencia. Calloc y Realloc
Existen dos funciones adicionales para reservar memoria,calloc()
y realloc()
. Los prototipos son dados a continuación: void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size);Cuando se usa la función
malloc()
la memoria no es inicializada (a cero) o borrada. Si se quiere inicializar la memoria entonces se puede usar la función calloc
. La función calloc
es computacionalmente un poco más cara pero, ocasionalmente, más conveniente que malloc
. Se debe observar también la diferencia de sintaxis entre calloc
y malloc
, ya que calloc
toma el número de elementos deseados (nmemb
) y el tamaño del elemento (size
), como dos argumentos individuales. Por lo tanto para asignar a 100 elementos enteros que estén inicializados a cero se puede hacer:
int *ip; ip = (int *) calloc(100, sizeof(int) );La función
realloc
intenta cambiar el tamaño de un bloque de memoria previamente asignado. El nuevo tamaño puede ser más grande o más pequeño. Si el bloque se hace más grande, entonces el contenido anterior permanece sin cambios y la memoria es agregada al final del bloque. Si el tamaño se hace más pequeño entonces el contenido sobrante permanece sin cambios. Si el tamaño del bloque original no puede ser redimensionado, entonces
realloc
intentará asignar un nuevo bloque de memoria y copiará el contenido anterior. Por lo tanto, la función devolverá un nuevo apuntador (o de valor diferente al anterior), este nuevo valor será el que deberá usarse. Si no puede ser reasignada nueva memoria la función realloc
devuelve NULL
. Si para el ejemplo anterior, se quiere reasignar la memoria a 50 enteros en vez de 100 apuntados por
ip
, se hará; ip = (int *) realloc ( ip, 50*sizeof(int) );
miércoles, 30 de marzo de 2011
Suscribirse a:
Entradas (Atom)