martiz de char doble puntero

Iniciado por neo_from_cs_matrix, 14 Julio 2011, 21:19 PM

0 Miembros y 1 Visitante están viendo este tema.

neo_from_cs_matrix


estatica
int main()
{
      char mchar[5][30];

      return 0;
}



dinamica
int main()
{
     int filas = 5;
     int columnas = 30;

     char **mchar = (char**)malloc(sizeof(char)*(filas*columnas));

     free(mchar);

      return 0;
}


la matriz de char creada de la s dos formas, pero me dijeron que esta mal la forma dinamica no se hace asi como esta escrito. se hace con malloc pero no asi coom lo expuce. la intension es declarar una mtriz de char pero no sabiendo sus dimensiones, y usando doble puntero y malloc. agredezco la colaboracion




Gallu

A mi me funciona así ..


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

int main()
{
     int filas = 5;
     int columnas = 30;
     int i = 0;
     char **listaPalabras = NULL;

     listaPalabras  = (char**) malloc(sizeof(char*) * filas * columnas);
   

     for (; i < filas ; i++){
listaPalabras[i] = (char*)malloc(sizeof(char) * columnas);
strcpy (listaPalabras[i] , "TEXTO PRUEBA\n");
     }
   
     for (i = 0; i < filas ; i++){
printf("%s ", listaPalabras[i]);
     }

     free(listaPalabras);

      return 0;
}
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

rir3760

Cita de: neo_from_cs_matrix en 14 Julio 2011, 21:19 PM
la matriz de char creada de la s dos formas, pero me dijeron que esta mal la forma dinamica no se hace asi como esta escrito. se hace con malloc pero no asi coom lo expuce.
Lo primero: en C puedes almacenar el valor de retorno de malloc y para el caso cualquier función que retorne un "void *" en cualquier variable de tipo "puntero a objeto".

Primero debes reservar memoria para el bloque principal que almacenara las direcciones de cada fila. A continuación debes reservar el bloque para cada una de las filas y cuyo tamaño es igual al numero de columnas por el tamaño del objeto almacenado.

Siguiendo el ejemplo que publicas la versión correcta es:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int **mat;
   int filas = 5;
   int columnas = 30;
   int i;
   
   /* Reserva del bloque principal */
   mat = malloc(filas * sizeof *mat);
   
   /* Reserva de la memoria para cada fila */
   for (i = 0; i < filas; i++)
      mat[i] = malloc(columnas * sizeof *mat[i]);
   
   /* ... Algun proceso ... */
   
   /* Liberamos la memoria de cada fila */
   for (i = 0; i < filas; i++)
      free(mat[i]);
   /* Liberamos el bloque principal */
   free(mat);
   
   return EXIT_SUCCESS;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language