Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 25 Noviembre 2013, 03:09 am



Título: memoria dinamica y funciones
Publicado por: m@o_614 en 25 Noviembre 2013, 03:09 am
saludos

tengo el siguiente codigo en el que le asigno memoria dinamica a una matriz en lenguaje C para poder ingresarle x numero de datos, el problema que tengo es que si quiero pasarle la matriz a una funcion para dentro de esta asignarle memoria dinamica el programa me truena, pero si se la asigno dentro del main el programa funciona correctamente y no se a que se debe, este es el codigo que me truena:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void inicializaTablero(char **tablero,int n);
  5.  
  6. int main()
  7. {
  8.    int n,i,j;
  9.    char **tablero;
  10.    printf("Dame tamanio de tablero: ");
  11.    scanf("%d",&n);
  12.    inicializaTablero(tablero,n);
  13.    for(i = 0;i < n;i++)
  14.    {
  15.        printf("\n");
  16.        for(j = 0;j < n;j++)
  17.        printf("[%c]",tablero[i][j]);
  18.    }
  19.    return 0;
  20. }
  21.  
  22. void inicializaTablero(char **tablero,int n)
  23. {
  24.    int i,j,k;
  25.     tablero = (char**)malloc(n*sizeof(char*));
  26.    for(i = 0;i < n;i++)
  27.       tablero[i] = (char*)malloc(n);
  28.    for(j = 0;j < n;j++)
  29.    {
  30.        for(k = 0;k < n;k++)
  31.           tablero[j][k] = '0';
  32.    }
  33. }
  34.  


y de esta manera si funciona:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    int n,i,j,k;
  7.    char **tablero;
  8.    printf("Dame tamanio de tablero: ");
  9.    scanf("%d",&n);
  10.    tablero = (char**)malloc(n*sizeof(char*));
  11.    for(i = 0;i < n;i++)
  12.       tablero[i] = (char*)malloc(n);
  13.    for(j = 0;j < n;j++)
  14.    {
  15.        for(k = 0;k < n;k++)
  16.           tablero[j][k] = '0';
  17.    }
  18.    for(i = 0;i < n;i++)
  19.    {
  20.        printf("\n");
  21.        for(j = 0;j < n;j++)
  22.        printf("[%c]",tablero[i][j]);
  23.    }
  24.    return 0;
  25. }
  26.  

de antemano gracias



Título: Re: memoria dinamica y funciones
Publicado por: rir3760 en 25 Noviembre 2013, 16:45 pm
Eso sucede porque en C todo se pasa por valor, si quieres modificar una variable declarada en otra función tienes que hacerlo indirectamente emulando el paso por referencia:

1) La función recibe la dirección en memoria del objeto.
2) Utilizando indirección se accede al objeto apuntado.
Ejemplos sobre ello los puede consultar vía el motor de búsqueda de los foros.

Si aplicamos eso al primer programa tenemos:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void inicializaTablero(char ***tablero, int n);
  5.  
  6. int main(void)
  7. {
  8.   int n,i,j;
  9.   char **tablero;
  10.  
  11.   printf("Dame tamanio de tablero: ");
  12.   fflush(stdout);
  13.   scanf("%d", &n);
  14.  
  15.   inicializaTablero(&tablero,n);
  16.   for(i = 0;i < n;i++){
  17.      for(j = 0; j < n; j++)
  18.         printf("[%c]", tablero[i][j]);
  19.  
  20.      putchar('\n');
  21.   }
  22.  
  23.   return 0;
  24. }
  25.  
  26. void inicializaTablero(char ***tablero, int n)
  27. {
  28.   int i,j,k;
  29.  
  30.   *tablero = malloc(n * sizeof **tablero);
  31.   for(i = 0; i < n; i++)
  32.      (*tablero)[i] = malloc(n);
  33.  
  34.   /* NO tiene caso, en su lugar usa la funcion calloc */
  35.   for (j = 0; j < n; j++)
  36.      for (k = 0; k < n; k++)
  37.         (*tablero)[j][k] = '0';
  38. }

Por ultimo y sin temor a repetir: en C la conversión explicita no es necesaria.

Un saludo