[C con Clase] Duda con Matriz

Fernando Acua facua en hotmail.com
Mie Feb 20 02:57:25 CET 2013


Con respecto a los bytes que reservo para cada cadena:
El pasado 2013-02-19 16:28:53, Steven Davidson escribió:
 
SD> Hola Fernando,
SD> 2013/2/18 Fernando Acua <facua en hotmail.com>
SD> >
SD> >
SD> >
SD> [CORTE]
SD> Finalmente gracias a sus consejos el programa quedó así, aunq falta incluir
SD> > la comprobación de memoria cuando se usa malloc:
SD> >
SD> >
SD> Me he dado cuenta que hay un error en tu código.
SD>     // reservar 3 bytes p cada elemento
SD> >     for(f=0; f<FIL; f++) for(c=0; c<COL; c++)
Porqué he usado hasta hasta menos d 3 bytes y no me marca ningún error, hasta
he usado solo el (sizeof(char)) e incluso le copio más caracteres y no da problemas
SD> > pcMatriz[f][c]=(char*)malloc(3*sizeof(char));
SD> >
SD> >     // copiar "abc" a cada elem
SD> >     for(f=0; f<FIL; f++) for(c=0; c<COL; c++) strcpy(pcMatriz[f][c],"abc");
SD> >
SD> >
SD> Aquí estás copiando 4 caracteres (de "abc") a un array que contiene 3
SD> elementos. Recuerda que las cadenas de caracteres se auto-terminan
SD> agregando el carácter nulo al final de la información. Por lo tanto, debes
SD> crear arrays dinámicos de 4 caracteres, para poder guardar el carácter
SD> nulo. Esto es,
SD> /* 4 char = 3 caracteres + carácter nulo */
SD> for(f=0; f<FIL; f++) for(c=0; c<COL; c++) pcMatriz[f][c]=(char*)malloc( 4 );
SD>     // impresion de matriz
SD> >     for(f=0; f<FIL; f++)
SD> >     {
SD> >         for(c=0; c<COL; c++) printf("%i.%i=%s  ",f,c,pcMatriz[f][c]);
SD> >         printf("\n");
SD> >     }
SD> >
SD> >     // liberacion de recursos:
SD> >     for(f=0; f<FIL; f++) for(c=0; c<COL; c++) free( *(*(pcMatriz+f)+c) );
SD> >     for(f=0; f<FIL; f++) free( *(pcMatriz+f) );
SD> >
SD> No es necesario usar la forma aritmética para tratar los punteros. Creo que
SD> es más legible usar el operador []. Esto es,
Esta notación vectorial se me hace mas compresible:
SD> for(f=0; f<FIL; f++) for(c=0; c<COL; c++) free( pcMatriz[f][c] );
SD> for(f=0; f<FIL; f++) free( pcMatriz[f] );
SD>     free(pcMatriz);
SD> >
SD> >     return(0);
SD> > }
SD> >
Finalmente estoy compilando con Code::Blocks sobre Ubuntu 11.04, esto tendrá que ver con los dichosos bytes que reservo con malloc y no manda errores ?
SD> Espero que esto te ayude.
SD> Steven
SD> _______________________________________________
SD> Lista de correo Cconclase Cconclase en listas.conclase.net
SD> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SD> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

Gracias mil...


Más información sobre la lista de distribución Cconclase