elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  memoria dinamica y funciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: memoria dinamica y funciones  (Leído 1,292 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
memoria dinamica y funciones
« 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



En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: memoria dinamica y funciones
« Respuesta #1 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


En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Asignacion Dinamica Memoria
Programación C/C++
charmedever 5 3,429 Último mensaje 21 Octubre 2011, 05:25 am
por charmedever
Memoria dinámica
Programación C/C++
eleon 6 4,806 Último mensaje 24 Enero 2012, 22:17 pm
por Eternal Idol
Memoria dinamica matriz
Programación C/C++
programacion_c 1 2,817 Último mensaje 25 Abril 2012, 00:23 am
por david_BS
[DUDA] Memoria Dinámica en C++
Programación C/C++
Zodiak98 3 2,390 Último mensaje 5 Junio 2013, 18:48 pm
por Zodiak98
[C] Lista dinámica de funciones en C (emulando los delegados de .NET)
Programación C/C++
MAFUS 2 1,781 Último mensaje 21 Diciembre 2015, 02:08 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines