Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: neo_from_cs_matrix en 14 Julio 2011, 21:19 pm



Título: martiz de char doble puntero
Publicado por: neo_from_cs_matrix en 14 Julio 2011, 21:19 pm

estatica
Código:
int main()
{
      char mchar[5][30];

      return 0;
}


dinamica
Código:
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





Título: Re: martiz de char doble puntero
Publicado por: Gallu en 14 Julio 2011, 21:49 pm
A mi me funciona así ..

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.     int filas = 5;
  8.     int columnas = 30;
  9.     int i = 0;
  10.     char **listaPalabras = NULL;
  11.  
  12.     listaPalabras  = (char**) malloc(sizeof(char*) * filas * columnas);
  13.  
  14.  
  15.     for (; i < filas ; i++){
  16. listaPalabras[i] = (char*)malloc(sizeof(char) * columnas);
  17. strcpy (listaPalabras[i] , "TEXTO PRUEBA\n");
  18.     }
  19.  
  20.     for (i = 0; i < filas ; i++){
  21. printf("%s ", listaPalabras[i]);
  22.     }
  23.  
  24.     free(listaPalabras);
  25.  
  26.      return 0;
  27. }
  28.  


Título: Re: martiz de char doble puntero
Publicado por: rir3760 en 15 Julio 2011, 00:05 am
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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int **mat;
  7.   int filas = 5;
  8.   int columnas = 30;
  9.   int i;
  10.  
  11.   /* Reserva del bloque principal */
  12.   mat = malloc(filas * sizeof *mat);
  13.  
  14.   /* Reserva de la memoria para cada fila */
  15.   for (i = 0; i < filas; i++)
  16.      mat[i] = malloc(columnas * sizeof *mat[i]);
  17.  
  18.   /* ... Algun proceso ... */
  19.  
  20.   /* Liberamos la memoria de cada fila */
  21.   for (i = 0; i < filas; i++)
  22.      free(mat[i]);
  23.   /* Liberamos el bloque principal */
  24.   free(mat);
  25.  
  26.   return EXIT_SUCCESS;
  27. }

Un saludo