memoria dinamica y funciones

Iniciado por m@o_614, 25 Noviembre 2013, 03:09 AM

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

m@o_614

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:

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

void inicializaTablero(char **tablero,int n);

int main()
{
    int n,i,j;
    char **tablero;
    printf("Dame tamanio de tablero: ");
    scanf("%d",&n);
    inicializaTablero(tablero,n);
    for(i = 0;i < n;i++)
    {
        printf("\n");
        for(j = 0;j < n;j++)
        printf("[%c]",tablero[i][j]);
    }
    return 0;
}

void inicializaTablero(char **tablero,int n)
{
    int i,j,k;
     tablero = (char**)malloc(n*sizeof(char*));
    for(i = 0;i < n;i++)
       tablero[i] = (char*)malloc(n);
    for(j = 0;j < n;j++)
    {
        for(k = 0;k < n;k++)
           tablero[j][k] = '0';
    }
}


y de esta manera si funciona:

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

int main()
{
    int n,i,j,k;
    char **tablero;
    printf("Dame tamanio de tablero: ");
    scanf("%d",&n);
    tablero = (char**)malloc(n*sizeof(char*));
    for(i = 0;i < n;i++)
       tablero[i] = (char*)malloc(n);
    for(j = 0;j < n;j++)
    {
        for(k = 0;k < n;k++)
           tablero[j][k] = '0';
    }
    for(i = 0;i < n;i++)
    {
        printf("\n");
        for(j = 0;j < n;j++)
        printf("[%c]",tablero[i][j]);
    }
    return 0;
}


de antemano gracias


rir3760

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:
#include <stdio.h>
#include <stdlib.h>

void inicializaTablero(char ***tablero, int n);

int main(void)
{
   int n,i,j;
   char **tablero;
   
   printf("Dame tamanio de tablero: ");
   fflush(stdout);
   scanf("%d", &n);
   
   inicializaTablero(&tablero,n);
   for(i = 0;i < n;i++){
      for(j = 0; j < n; j++)
         printf("[%c]", tablero[i][j]);
     
      putchar('\n');
   }
   
   return 0;
}

void inicializaTablero(char ***tablero, int n)
{
   int i,j,k;
   
   *tablero = malloc(n * sizeof **tablero);
   for(i = 0; i < n; i++)
      (*tablero)[i] = malloc(n);
   
   /* NO tiene caso, en su lugar usa la funcion calloc */
   for (j = 0; j < n; j++)
      for (k = 0; k < n; k++)
         (*tablero)[j][k] = '0';
}


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

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