[C con Clase] Duda con Matriz

Davidson, Steven srd4121 en njit.edu
Lun Feb 18 10:15:01 CET 2013


Hola Fernando,

2013/2/18 Fernando Acua <facua en hotmail.com>

> Hola de nuevo, intento seguir sus consejos, sin embargo, sigo mas
> confundido al querer usar una declaración char ***pcMatriz; creo que estoy
> exagerando en el uso de malloc y por ello me aparece el famoso "Violación
> de Segmento", por ello le dejo mi código con el q pretendo usar la pcMatriz:
>
>
El mensaje de la "Violación de Segmento" suele ocurrir porque intentas
acceder a memoria que no existe o mejor dicho, que no es tuya.

Veamos el código fuente.

#include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> #define FIL 3
> #define COL 5
>
> int main(void)
> {
>     int c, f;
>     char ***pcMatriz;
>
>     pcMatriz=(char***)malloc(FIL*sizeof(char));
>

Aquí estás creando 3 bytes. Esto no tiene mucho sentido ya que te interesa
crear 3 filas representadas como un array de 3 elementos de tipo puntero.
Esto es,

pcMatriz = (char***) malloc( FIL * sizeof(char**) );

    for(f=0; f<FIL; f++) pcMatriz[f]=(char**)malloc(COL*sizeof(char));
>

Aquí hacemos algo parecido. Nos interesa crear 5 columnas que serán
representadas como un array de 5 elementos, los cuales son de tipo puntero.
Esto debería ser:

pcMatriz = (char**) malloc( COL * sizeof(char*) );

    for(f=0; f<FIL; f++) for(c=0; c<COL; c++)
> pcMatriz[f][c]=(char*)malloc(3*sizeof(char));
>
>
Esto es correcto, pero no tienes por qué calcular el tamaño de 'char':
siempre será 1 byte.

    for(f=0; f<FIL; f++) for(c=0; c<COL; c++) strcpy(pcMatriz[f][c],"abc");
>     return(0);
>

Recuerda que cuando adjudiquemos memoria dinámicamente, debemos
desadjudicarla también. Si nos responsabilizamos de crear la memoria, nos
tenemos que responsabilizar de liberarla.

Necesitas realizar los mismos pasos de 'malloc()', pero en el orden inverso
e invocando 'free()', en su lugar.

}
>
>
Esto se explica en el capítulo 17 que mencioné en mi correo-e anterior:
http://c.conclase.net/curso/index.php?cap=017#inicio


Espero que esto te ayude.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130218/7de49703/attachment.html>


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