Abr 14
Ocio

Publicado por Abraham Covelo

Abr 14
Programación Como ya habiamos comentado en un anterior post sobre la asignación de memoria dinámica además de malloc que asigna un zona de memoria para nuestra programa tanto realloc como calloc hacen exactamente lo mismo pero además tienen capacidades adicionales (que las hacen maś caras computacionalmente hablando, así que si no necesitas ninguna de estas características utliliza directamente malloc. Sino estarás malgastando recursos).

La función calloc cuya firma o prototipo es la siguiente:

void* calloc(size_t nmemb, size_t size);

Inicializa la zona de memoria reservada. Como se puede observar sus argumentos son diferentes de las de la función malloc que sólo recibía el número de bytes a reservar. Para calloc es necesario dar el número de elementos a reservar y el tamaño de cada uno de esos elementos. Así tenemos que por ejemplo:

int* pi;
pi = calloc(50,sizeof(int));

Reservará espacio para 50 enteros asignando al puntero pi la dirección en memoria del primero.

La función realloc por otra parte intenta cambiar el tamaño de una zona de memoria previamente asignada dinamicamente copiando, si es posible, su contenido anterior.

Esta es su firma:

void* realloc(void* ptr, size_t size);

Si el cambio de tamaño no se puede llevar a cabo entonces la función devolverá un puntero a null

ip = (int* ) realloc ( ip, 25*sizeof(int) );

Siguiendo el primer ejemplo este redimensionará la zona de memoria asignada por la función calloc. Debemos tener en cuenta que esta función puede modificar además el valor del puntero. Recolocando la zona de memoria reservada en otra zona de la memoria de la máquina dependiendo de la situación. Incluso una disminución en el tamaño de la memoria puede dar lugar a una recolocación del segmento de memoria.

Como con malloc y calloc toda memoria reservada dinámicamente debe ser liberada con free.

void free(void* ptr);



Publicado por Abraham Covelo

Abr 10
Política nacional La presidenta de la Comunidad Autónoma Madrileña, Esperanza Aguirre, podría presentarse al congreso que su partido va a celebrar el próximo mes de junio en Valencia para elegir al próximo presidente del PP.

Los últimos movimientos y noticias en el seno del PP está claro que son tomas de posicionamiento de cara a esta posibilidad que aparecía una y otra vez en los medios de comunicación. Aguirre está comprobando sus posibilidades a viva cuenta de que su archienemigo Luis Gallardón, alcalde de Madrid podría ocupar un nuevo cargo de enorme responsabilidad dentro del partido.

Esto se pone interesante y estoy deseando que Esperanza se presente, imagínate que celebrasen debates Rajoy - Aguirre uno en Telecinco y otro en la COPE. ¿Sobre que niña hablará ahora Rajoy?

Publicado por Abraham Covelo

Abr 9
Programación Glibc proporciona varias funciones para reservar memoria bajo el control explícito del programa. Cada una de estas funciones varían en cuanto a eficiencia:

  • La familia de funciones malloc permite una reserva de memoria completamente genérica.
  • Obstack es otra familia de funciones menos genérica pero más eficiente para reservar memoria tipo pila.
  • Y la función alloca te permite reservar espacio de almacenamiento dinámicamente que será liberada automáticamente.


  • Las funciones tipo malloc son las más empleadas debido a su versatilidad (aunque haya que pagar un coste en eficiencia). Está es la firma de la función malloc

    void *malloc(size_t number_of_bytes);

    Su empleo es muy sencillo, si quieres reservar digamos 300 bytes debes pasarle ese número como parámetro y la función, en caso de éxito, te devolverá un puntero al comienzo de esa zona de 300 bytes reservada para ti. En caso de error devuelve un puntero a NULL (generalmente debido a una falta de memoria). El puntero a void, el tipo del valor de retorno, simplemente nos permite, mediante un cast (implicito), emplear cualquier tipo de datos para su almacenamiento. El tipo size_t es simplemente un unsigned int definido en varios archivos de cabecera stdio.h, stddef.h, stdlib.h, and string.h:

    typedef unsigned int size_t;


    por ejemplo

    char *micadena;
    micadena = malloc(200);

    Intentará hacer que el puntero micadena apunte al comienzo de una zona reservada para ti de 200 bytes o retornando un puntero a null en caso de fallo.

    El operador sizeof (atención no es una función aunque lo parezca) se utiliza muy a menudo en conjunción con malloc ya que este nos devuelve el número de bytes que ocupa un determinado tipo de datos que se le pasa como argumento, así:

    sizeof(int);
    sizeof(char);
    sizeof(miEstructura);

    Nos devolverá el tamaño que ocupa en bytes un entero un caracter o una estructura definida por nosotros respectivamente. Siguiendo nuestro ejemplo para reservar espacio para una cadena de 200 caracteres la forma más correcta tras todo esto sería:

    char *micadena;
    micadena = malloc(sizeof(char)*200);
    if(!micadena)
    {
    printf("Error fatal. No hay suficiente memoria\n);
    }

    sizeof puede ser usado para encontrar el tamaño de cualquier tipo de datos, variables o estructuras. Simplemente debes proporcionale uno de estos como argumento. Pongo otro ejemplo de esto:

    int i;
    struct COORD {float x,y,z};
    typedef struct COORD PT;

    i = sizeof(int);
    i = sizeof(i);
    i = sizeof(struct COORD);
    i = sizeof(PT);

    Todas las lineas anteriores son válidas.

    Una función que si debería estar siempre acompañando a malloc es la función free. Se encarga de liberar la memoria que previamente hemos reservado, su firma es la siguiente:

    void free(void *ptr);

    y el puntero que le debemos pasar como argumento es obviamente el que nos devolvió la función malloc. Un error relativamente común cuando empleamos malloc es no utilizar free para liberar la memoria cuando ya no la necesitamos. Esta es la causa principal de los llamados "memory leaks" o "porque mi programa consume desenfrenadamente más y más memoria".

    Una nota sobre malloc: malloc NUNCA inicializa el bloque de memoria que acaba de reservar. Si crees por ejemplo que ese bloque debe contener byes a cero estas equivocado, puede contener cualquiera valores (basura).

    Para no hacer este post más extenso comentaré en otro proximamente las funciones realloc y calloc cuyo propósito es idéntico aunque tienen nuevas características (que también los hacen más caros computancionalmente hablando)

    Para saber más:
    Librería C de GNU

    Publicado por Abraham Covelo

(Página 2 de 4, en total 16 entradas)