Ver Mensaje Individual
  #7 (permalink)  
Antiguo 08/02/2017, 03:27
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses
Puntos: 73
Respuesta: problemas con punteros y matrices

Te incluyo un programa de ejemplo, hecho con Codeblocks versión 16.01 y MinGW 4.9.2 (32 bits)

Las funciones pedir_memoria_1() y borrar_memoria_1(), que utilizan directamente el puntero, me provocan ambas un error de segmentación.

Las funciones pedir_memoria_2() y borrar_memoria_2(), que (en teoría) funcionan como las versiones _1, pero utilizando una variable intermedia, me funcionan perfectamente. La función borrar_memoria_2() lo que hace es poner el puntero original a NULL una vez que libera la memoria (ya te comenté por qué hacerlo así).

La función borrar_memoria_3() es la tuya original.

La función matriz_prueba() es para comprobar que la matriz se ha creado correctamente.

¿Por qué funcionan las versiones que usan una variable intermedia y las otras no? Francamente, no lo sé, pero habiendo un modo de que funcione...

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void pedir_dimension (int *f, int *c);
  6. void pedir_memoria_1 (int ***a, int f, int c);
  7. void pedir_memoria_2 (int ***a, int f, int c);
  8. void matriz_prueba   (int **a,  int f, int c);
  9. void imprimir_matriz (int **a,  int f, int c);
  10. void borrar_matriz_1 (int ***a, int f, int c);
  11. void borrar_matriz_2 (int ***a, int f, int c);
  12. void borrar_matriz_3 (int **a, int f, int c);
  13.  
  14. int main()
  15. {
  16.     int    fils, cols;
  17.     int    **A;
  18.  
  19.     pedir_dimension(&fils, &cols);
  20.     //pedir_memoria_1(&A, fils, cols);
  21.     pedir_memoria_2(&A, fils, cols);
  22.     matriz_prueba(A, fils, cols);
  23.     imprimir_matriz(A, fils, cols);
  24.     //borrar_matriz_1(&A, fils, cols);
  25.     borrar_matriz_2(&A, fils, cols);
  26.     //borrar_matriz_3(A, fils, cols);
  27.  
  28.     return 0;
  29. }
  30.  
  31. void pedir_dimension (int *f, int *c)
  32. {
  33.     cin >> "Filas: "
  34.     cin >> *f;
  35.     cin >> "Columnas: ";
  36.     cin >> *c;
  37.  
  38.     cout << endl;
  39. }
  40.  
  41. void pedir_memoria_1 (int ***a, int f, int c)
  42. {
  43.     *a = new int*[f];
  44.     for (int i=0; i<f; i++)
  45.     {
  46.         *a[i] = new int[c];
  47.     }
  48. }
  49.  
  50. void pedir_memoria_2 (int ***a, int f, int c)
  51. {
  52.     int **b;
  53.  
  54.     b = new int*[f];
  55.     for (int i=0; i<f; i++)
  56.     {
  57.         b[i] = new int[c];
  58.     }
  59.     *a = b;
  60. }
  61.  
  62. void matriz_prueba (int **a, int f, int c)
  63. {
  64.     for (int i=0; i<f; i++)
  65.         for (int j=0; j<c; j++)
  66.             a[i][j] = 10*(i+1) + (j+1);
  67. }
  68.  
  69. void imprimir_matriz (int **a, int f, int c)
  70. {
  71.     for (int i=0; i<f; i++)
  72.     {
  73.         for (int j=0; j<c; j++)
  74.         {
  75.             cout << a[i][j] << " ";
  76.         }
  77.         cout << endl;
  78.     }
  79. }
  80.  
  81. void borrar_matriz_1 (int ***a, int f, int c)
  82. {
  83.     for (int i=0; i<f; i++)
  84.         delete[] *a[i];
  85.     delete[] *a;
  86.     *a = NULL;
  87. }
  88.  
  89. void borrar_matriz_2 (int ***a, int f, int c)
  90. {
  91.     int **b;
  92.  
  93.     b = *a;
  94.     for (int i=0; i<f; i++)
  95.         delete[] b[i];
  96.     delete[] b;
  97.     *a = NULL;
  98. }
  99.  
  100. void borrar_matriz_3 (int **a, int f, int c)
  101. {
  102.     for (int i=0; i<f; i++)
  103.         delete[] a[i];
  104.     delete[] a;
  105. }

De todos modos, me pica la curiosidad, voy a probar utilizando C puro y duro con malloc() a ver qué pasa. Ya te comentaré.

Saludos,