lunes, 23 de marzo de 2009

Ejemplo básico de como pedir memoria para una matriz y liberarla

Para pedir memoria para una matriz y liberarla, vamos a usar las siguientes dos funciones:

[sourcecode language='cpp']float **matrix(int nr, int nc)
{//asigna memoria para una matriz y regresa un puntero al comienzo de ‚sta.
int i;
float **m=NULL;
if (nr<1)return(NULL);
m=(float **) malloc(nr*sizeof(float*));
if (!m) return(m);
for (i=0;i{
m[i]=(float *) malloc(nc*sizeof(float));
if (!m[i]) exit(1);
}
return(m);
}[/sourcecode]

[sourcecode language='cpp']void free_matrix(float **m,int nr,int nc)
{
int i;
if (m!=NULL)
{
for (i=0;iif (m[i]!=NULL) free(m[i]);
free(m);
}

}[/sourcecode]

Para pedir memoria, por ejemplo, para una matriz de 5x10 simplemente mandamos llamar la primera función así:
[sourcecode language='cpp']float **m;
m=matrix(5,10);[/sourcecode]
y para liberar la memoria usada por ese apuntadro, usamos:
[sourcecode language='cpp']free_matrix(m,nr,nc)[/sourcecode]

Un ejemplo completo está en nuestro foro:
Pedir memoria para una matriz, llenar la matriz y liberar la memoria de la matriz

5 comentarios:

  1. Qué quiere decir el último asterisco de esta línea:

    m=(float **) malloc(nr*sizeof(float*));

    ?

    PD: Has desabilitado el e-mail o va mal?

    Saludos!

    ResponderEliminar
  2. [...] Aquí sólo explicare la idea de como construir arrays de dos dimensiones en C/C++ usando la función de este post. [...]

    ResponderEliminar
  3. Hola JoniJnm!

    Bueno, hay que entender primero como es que se construyen las matrices en C.Dado que aqui hay poco espacio, escribi un post para eso, que esta aqui:
    http://foro-c.com/blog/construirarrays-dinamicos-de-dos-dimensiones-en-c/

    Entonces, como ves, ese asterisco por el que preguntas, es porque es una lista de "float *", es decir, una lista de cada uno de los renglones de la matriz.

    Saludos

    P.D.Lo del e-mail, no se a que te refieres. Aunque he estado deshabilitando cosas en el blog porque tengo mucho spam.

    ResponderEliminar
  4. Hola, tengo una duda, para que ingresas el valor de nc a la función free_matrix su dentro de ella no estas usando, he seguido tu ejemplo y al parecer no me está liberando la memoria hasta cerrar el programa.

    como experimento, he mandado ha imprimir en pantalla algunos valores de la matriz antes de borrarlo y después y me imprime los mismos valores.

    no se si entiendas mi duda, saludos.

    ResponderEliminar
  5. Hola,

    En cuanto al parámetro nc, pues si la regue, por copiar la cabecera de la otra función. Sólo hay que quitar ese parámetro y ya.

    En cuanto a lo de liberrar memoria, lo que pasa es que al liberarla no borras el contendio de dicha memoria que liberas. Simplemente la dejas libre para ser usada por el programa (u otro porgrama que este ejecutandose al mismo tiempo).

    Si despues de liberarla aun puedes leer los valores, es porque aun no ha sido ocupado ese espacio por otra variable y ha escrito sobre ella. Podrias hacer un programa que pida memoria para una matriz, digamos de 3x3, la llenas de valores y luego la liberas. Ahora pides memoria para mas matrices, pero de mayor tamaño, digamos de 512x512, las llenas de valores (esto es importante, porque C no "limpia" automaticamente la memoria) y vas a ver (con suerte) que los valores ahora si no se conservan en la matriz de memoria liberarda, ya que va a ser ocupada por alguna de las otras matrices.

    Saludos

    ResponderEliminar