[C con Clase] Duda con Matriz

Fernando Acua facua en hotmail.com
Lun Feb 18 22:35:22 CET 2013


> AL parecer ya quedo!:

El pasado 2013-02-18 09:14:56, Steven Davidson escribió:
 
SD> Hola Fernando,
SD> 2013/2/18 Fernando Acua <facua en hotmail.com>
SD> > Hola de nuevo, intento seguir sus consejos, sin embargo, sigo mas
SD> > confundido al querer usar una declaración char ***pcMatriz; creo que estoy
SD> > exagerando en el uso de malloc y por ello me aparece el famoso "Violación
SD> > de Segmento", por ello le dejo mi código con el q pretendo usar la pcMatriz:
SD> >
SD> >
SD> El mensaje de la "Violación de Segmento" suele ocurrir porque intentas
SD> acceder a memoria que no existe o mejor dicho, que no es tuya.
SD> Veamos el código fuente.
SD> #include <stdio.h>
SD> > #include <stdlib.h>
SD> > #include <string.h>
SD> >
SD> > #define FIL 3
SD> > #define COL 5
SD> >
SD> > int main(void)
SD> > {
SD> >     int c, f;
SD> >     char ***pcMatriz;
SD> >
SD> >     pcMatriz=(char***)malloc(FIL*sizeof(char));
SD> >
SD> Aquí estás creando 3 bytes. Esto no tiene mucho sentido ya que te interesa
SD> crear 3 filas representadas como un array de 3 elementos de tipo puntero.
SD> Esto es,
> usé esta forma, aunque
SD> pcMatriz = (char***) malloc( FIL * sizeof(char**) );
>  agregué un (*) al último sizeof(char*), porq me marcaba el mismo error de segmento inválido
SD>     for(f=0; f<FIL; f++) pcMatriz[f]=(char**)malloc(COL*sizeof(char));
SD> >
SD> Aquí hacemos algo parecido. Nos interesa crear 5 columnas que serán
SD> representadas como un array de 5 elementos, los cuales son de tipo puntero.
SD> Esto debería ser:
SD> pcMatriz = (char**) malloc( COL * sizeof(char*) );
SD>     for(f=0; f<FIL; f++) for(c=0; c<COL; c++)
SD> > pcMatriz[f][c]=(char*)malloc(3*sizeof(char));
SD> >
SD> >
SD> Esto es correcto, pero no tienes por qué calcular el tamaño de 'char':
SD> siempre será 1 byte.
SD>     for(f=0; f<FIL; f++) for(c=0; c<COL; c++) strcpy(pcMatriz[f][c],"abc");
SD> >     return(0);
SD> >
SD> Recuerda que cuando adjudiquemos memoria dinámicamente, debemos
SD> desadjudicarla también. Si nos responsabilizamos de crear la memoria, nos
SD> tenemos que responsabilizar de liberarla.
SD> Necesitas realizar los mismos pasos de 'malloc()', pero en el orden inverso
SD> e invocando 'free()', en su lugar.
SD> }
SD> >
SD> >
SD> Esto se explica en el capítulo 17 que mencioné en mi correo-e anterior:
SD> http://c.conclase.net/curso/index.php?cap=017#inicio
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

Finalmente gracias a sus consejos el programa quedó así, aunq falta incluir la comprobación de memoria cuando se usa malloc:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FIL 3
#define COL 5

int main(void)
{
    int c, f;
    char ***pcMatriz;

    // asignar filas y columnas
    pcMatriz=(char***)malloc(FIL*sizeof(char**));
    for(f=0; f<FIL; f++) pcMatriz[f]=(char**)malloc(COL*sizeof(char*));


    // reservar 3 bytes p cada elemento
    for(f=0; f<FIL; f++) for(c=0; c<COL; c++) pcMatriz[f][c]=(char*)malloc(3*sizeof(char));

    // copiar "abc" a cada elem
    for(f=0; f<FIL; f++) for(c=0; c<COL; c++) strcpy(pcMatriz[f][c],"abc");

    // impresion de matriz
    for(f=0; f<FIL; f++)
    {
        for(c=0; c<COL; c++) printf("%i.%i=%s  ",f,c,pcMatriz[f][c]);
        printf("\n");
    }

    // liberacion de recursos:
    for(f=0; f<FIL; f++) for(c=0; c<COL; c++) free( *(*(pcMatriz+f)+c) );
    for(f=0; f<FIL; f++) free( *(pcMatriz+f) );
    free(pcMatriz);

    return(0);
}

Hasta pronto y long double de Gracias. :-D


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