Logo de Torre de Babel
Portada Libros Diseño web Artículos Glosario RSS
Buscar

Asignación dinámica de memoria en C

Todos los que programamos con C/C++, incluso los que nos consideramos experimentados, solemos emplear una significativa cantidad de tiempo depurando errores siempre relacionados con el mismo tema: la asignación dinámica de memoria. Siguiendo una serie de reglas básicas podemos reducir apreciablemente este tipo de fallos:

  1. Antes de usar un puntero comprobar que no es NULL. Introducir un if(q) usa_q_como_sea; nos ahorrará muchos disgustos.
  2. Asignar el valor NULL a todo puntero sin inicializar. Acostumbrarse a escribir char* q = NULL es una buena costumbre.
  3. Tras asignar memoria dinámicamente, inicializarla de inmediato. Tras un q = malloc(sizeof(X)) siempre un memset(q,0,sizeof(X)), así evitaremos usar la basura que hay en la memoria sin inicializar.
  4. Usar siempre strncpy() y strncat() al operar sobre cadenas asignadas dinámicamente, así evitaremos escribir más allá del tamaño del bloque, en zonas de memoria que no nos pertenecen.
  5. No calcular nunca a mano el tamaño de los operandos, en su lugar recurrir siempre al operador sizeof(). El tamaño de los tipos básicos y la alineación de los campos en las estructuras alteran el espacio que se ocupa.
  6. Al trabajar con cadenas, no olvidar que si hemos asignado N bytes dinámicamente, sólo podremos almacenar N-1 caracteres. Obvio, pero fuente de muchos quebraderos de cabeza.
  7. Antes de asignar a un puntero no nulo otra dirección, no olvidar liberar la memoria previamente asignada. La construcción if(q) free(q) ha de ser una costumbre antes de reutilizar una variable puntero.
  8. Cada free(q) irá siempre seguido de un q = NULL, así evitaremos acceder a bloques de memoria que ya hemos liberado.
  9. Moldear siempre los punteros al tipo correcto, de lo contrario la aritmética de punteros no funcionará. Una operación del tipo q++ nos llevará a una dirección u otra dependiendo del tipo de q.
  10. Antes de usar un puntero comprobar que no es NULL. Esta regla, primera y última, es fundamental y nunca suficientemente repetida. Comprobar siempre que un puntero no es NULL antes de leer o escribir con él.

Espero que estas indicaciones puedan ser de alguna utilidad a los que programan diariamente utilizando el lenguaje C.


Publicado el 31/3/2007

Curso de shaders

Torre de Babel - Francisco Charte Ojeda - Desde 1997 en la Web