• Miércoles 20 de Noviembre de 2024, 16:14

Autor Tema:  Copiar doble puntero C  (Leído 2689 veces)

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Copiar doble puntero C
« en: Lunes 23 de Agosto de 2010, 14:23 »
0
Hola.

Tengo dudas de si lo que hago es correcto.

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7.   char **mat, **matAux;
  8.   int i, j;
  9.  
  10.  
  11.   //Reservo memoria para una matriz 5x5
  12.   mat = (char**) malloc(sizeof(char*) * 5);               //Creamos la matriz dinamica
  13.    
  14.       if(mat != NULL)
  15.       {
  16.           for(i=0 ; i < 5; i++)
  17.           {    
  18.               mat[i] = (char*) malloc(sizeof(char) * 5);            
  19.           }  
  20.       }    
  21.      
  22.       //La relleno de letras a
  23.       for(i = 0; i < 5; i++)
  24.       {
  25.           for(j = 0; j < 5; j++)
  26.           {
  27.               mat[i][j] = 'a';                      
  28.           }      
  29.                  
  30.       }
  31.                
  32.                
  33.         //Imprimo su contenido        
  34.         for(i = 0; i < 5; i++)
  35.         {            
  36.              for(j = 0; j < 5; j++)
  37.              {
  38.                  printf("%c", mat[i][j]);        
  39.              }        
  40.              
  41.              printf("n");
  42.         }  
  43.        
  44.         printf("n");
  45.         printf("n");
  46.         printf("n");
  47.        
  48.    
  49.    
  50.     //Reservo memoria para una matriz 10x10 en una matriz auxiliar
  51.     matAux = (char**) malloc(sizeof(char*) * 10);              
  52.    
  53.       if(matAux != NULL)
  54.       {
  55.           for(i=0 ; i < 10; i++)
  56.           {    
  57.               matAux[i] = (char*) malloc(sizeof(char) * 10);            
  58.           }  
  59.       }    
  60.      
  61.       //Libero la memoria de la 5x5
  62.       for(i=0 ; i < 5 ; i++)
  63.       {
  64.           free(mat[i]);
  65.       }
  66.       free(mat);
  67.  
  68.       //Hago que mat apunte a la matriz 10x10
  69.       mat = matAux;                
  70.        
  71.      
  72.       //Libero la memoria de matAux
  73.       for(i=0 ; i < 10 ; i++)
  74.       {
  75.           free(matAux[i]);
  76.       }
  77.       free(matAux);
  78.                  
  79.      
  80.       //Relleno la matriz de letras b
  81.       for(i = 0; i < 10; i++)
  82.       {
  83.           for(j = 0; j < 10; j++)
  84.           {
  85.               mat[i][j] = 'b';                      
  86.           }      
  87.                  
  88.       }
  89.                
  90.                
  91.       //La imprimo por pantalla
  92.         for(i = 0; i < 10; i++)
  93.         {            
  94.              for(j = 0; j < 10; j++)
  95.              {
  96.                  printf("%c", mat[i][j]);        
  97.              }        
  98.              
  99.              printf("n");
  100.         }  
  101.        
  102.                
  103.     system("PAUSE");
  104.     return 0;    
  105. }
  106.  
  107.  
  108.  

Lo que quiero hacer es crear una matriz dinamica "mat", crear una matriz auxiliar "matAux", liberar la memoria de "mat" creada anteriormente, hacer que "mat" apunte al mismo contenido que "matAux" y liberar la memoria liberada por "matAux".

Es correcto lo que he hecho? Es correcta la manera de hacer que "mat" apunte al mismo contenido que "matAux" haciendo mat = matAux;?

He puesto un ejemplo simplificado de un problema real que tengo, tengo una matriz "mat", más adelante cargo una nueva matriz dinamica "matAux", libero la memoria de "mat" y hago que apunte a "matAux" y finalmente libero la memoria de "matAux".

Si hago esto una vez, funciona bien, pero si vuelvo a hacer lo mismo, me da un error de ejecución, y realmente no sé si lo que estoy haciendo lo estoy haciendo bien.

Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copiar doble puntero C
« Respuesta #1 en: Lunes 23 de Agosto de 2010, 15:49 »
0
Cita de: "player_"
Lo que quiero hacer es crear una matriz dinamica "mat", crear una matriz auxiliar "matAux", liberar la memoria de "mat" creada anteriormente, hacer que "mat" apunte al mismo contenido que "matAux" y liberar la memoria liberada por "matAux".

No mire el codigo y solo lei hasta aca, hay un problema de logica, reservas memoria 2 veces y liberas memoria 2 veces, eso es correcto PERO entonces no podes pretender tener un puntero valido.

mat = memoria_1
mataux = memoria_2
liberar memoria_1
mat = mataux = memoria_2
liberar mataux = memoria_2 = mat

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Copiar doble puntero C
« Respuesta #2 en: Lunes 23 de Agosto de 2010, 16:30 »
0
Igual no me he explicado del todo bien, voy a explicar el problema que tengo paso a paso a ver si así queda más claro:

Tengo una clase con un doble puntero "mat" en la parte privada para crear una matriz de forma dinámica y un método CrearMatriz en la parte pública donde voy a reservar memoria para esta matriz y si hay memoria suficiente, la relleno de datos.


Llamo al método CrearMatriz, primero indico el número de filas y de columnas que quiero, reservo la memoria de forma dinámica y si hay memoria suficiente, la relleno.

Después, vuelvo a llamar al método CrearMatriz, indico el número de filas y columnas que quiero y mediante un doble puntero auxiliar "matAux" reservo la memoria de forma dinámica, si hay suficiente memoria, lo que hago es liberar la memoria que había reservado anteriormente con "mat" y acto seguido hago que "mat" apunte a la misma dirección de memoria que "matAux", y si NO hay memoria suficiente, al haber usado un puntero auxiliar, mi matriz creada anteriormente con "mat" sigue intacta.

Pues bien, aquí vienen las dudas que tengo:

Si en la segunda vez que llamo al método CrearMatriz, hago mat = matAux, estoy indicando bien que "mat" apunte a "matAux"?

Y después de haber hecho mat = matAux, si ahora quiero que solo "mat" apunte a esa dirección de memoria y "matAux" ya no lo haga, que debo hacer, libero la memoria que había reservado con matAux (con delete o free)? (así creo que me estaría cargando la matriz)

O por el contrario, ya no libero ninguna memoria porque cuando salga del método CrearMatriz la variable "matAux" se destruye automáticamente al estar fuera del ámbito en el que fue declarada?

Esas eran mis preguntas concretas. Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copiar doble puntero C
« Respuesta #3 en: Lunes 23 de Agosto de 2010, 17:42 »
0
mat = matAux esta bien, liberar la memoria como te dije antes esta mal, podes hacer algo muy simple como matAux = 0 si queres y efectivamente si es una variable local al terminar el metodo ya no puede ser referenciada al desaparecer su ambito.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Copiar doble puntero C
« Respuesta #4 en: Lunes 23 de Agosto de 2010, 22:10 »
0
Gracias por la respuesta, ya lo tengo claro.

Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Copiar doble puntero C
« Respuesta #5 en: Martes 24 de Agosto de 2010, 18:00 »
0
De nadas  :good:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.