Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Seyro97 en 2 Octubre 2015, 07:41 am



Título: (Ayuda) Programa crashea al acceder al último término de una matriz
Publicado por: Seyro97 en 2 Octubre 2015, 07:41 am
Hola a tod@s. El problema que tengo es que al acceder al último término de una matriz generada con 'malloc', el programa deja de funcionar.

Código
  1. matriz = (int **)malloc(orden * sizeof(int));
  2.  
  3. if(matriz == (int **)0) {
  4. printf("Error asignando memoria a la matriz (primer paso)");
  5. return 0;
  6. }
  7.  
  8. for(int i = 0; i < orden; i++) {
  9. matriz[i] = (int *)malloc(orden * sizeof(int));
  10.  
  11. if(matriz[i] == (int *)0) {
  12. printf("Error asignando memoria a la matriz (segundo paso)");
  13. return 0;
  14. }
  15. }

La variable 'matriz' es de tipo 'int **'. Cuando intento cambiar el valor de 'matriz[orden - 1][orden - 1], el programa se cierra inesperadamente (Windows). Estoy compilando con MinGW usando el siguiente comando:
Código
  1. gcc -Wall -std=c99 -o main.exe main.c

No me salta ningún 'Warning'.

La parte donde cambio los datos de la matriz es:

Código
  1. int tempValue;
  2. int *tempPointer;
  3.  
  4. for(unsigned int fila = 0; fila < orden; fila++) {
  5. for(unsigned int columna = 0; columna < orden;) {
  6. printf("\nIntroduzca el elemento fila %u columna %u: ", fila, columna);
  7.  
  8. if(scanf("%i", &tempValue) == EOF) {
  9. printf("\nLa proxima vez introduzca un numero valido.");
  10. } else {
  11. tempPointer = matriz[fila];
  12. tempPointer[columna] = tempValue;
  13.  
  14. columna++;
  15. }
  16. }
  17. }
  18.  
  19. Según el debugger, el programa crashea en


Título: Re: (Ayuda) Programa crashea al acceder al último término de una matriz
Publicado por: Seyro97 en 2 Octubre 2015, 08:11 am
Ya sé en que me equivoqué jaja.

Os dejo el resultado:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct {
  5. int **elements;
  6. } Mat;
  7.  
  8. unsigned int IngresarMatriz(Mat *matriz);
  9. void ImprimirMatriz(Mat *matriz, unsigned int orden);
  10.  
  11. int main() {
  12. unsigned int orden = 0;
  13. Mat matriz;
  14.  
  15. orden = IngresarMatriz(&matriz);
  16.  
  17. if(orden == 0)
  18. return 1;
  19.  
  20. printf("%p", matriz);
  21.  
  22. ImprimirMatriz(&matriz, orden);
  23.  
  24. for(int i = 0; i < orden; i++)
  25. free((void *)matriz[i]);
  26.  
  27. free((void *)matriz);
  28.  
  29. return 0;
  30. }
  31.  
  32. unsigned int IngresarMatriz(Mat *matriz) {
  33. unsigned int orden;
  34. int *tempPointer;
  35. int tempValue;
  36.  
  37. printf("Introduzca el orden de la matriz cuadrada: ");
  38.  
  39. if(scanf("%u", &orden) == EOF) {
  40. printf("\nLa proxima vez introduzca un numero valido.");
  41. return 0;
  42. }
  43.  
  44. matriz->elements = (int **)malloc(orden * sizeof(int));
  45.  
  46. if(matriz->elements == (int **)0) {
  47. printf("Error asignando memoria a la matriz (primer paso)");
  48. return 0;
  49. }
  50.  
  51. for(int i = 0; i < orden; i++) {
  52. matriz->elements[i] = (int *)malloc(orden * sizeof(int));
  53.  
  54. if(matriz->elements[i] == (int *)0) {
  55. printf("Error asignando memoria a la matriz (segundo paso)");
  56. return 0;
  57. }
  58. }
  59.  
  60. for(unsigned int fila = 0; fila < orden; fila++) {
  61. for(unsigned int columna = 0; columna < orden;) {
  62. printf("\nIntroduzca el elemento fila %u columna %u: ", fila, columna);
  63.  
  64. if(scanf("%i", &tempValue) == EOF) {
  65. printf("\nLa proxima vez introduzca un numero valido.");
  66. } else {
  67. tempPointer = matriz->elements[fila];
  68. tempPointer[columna] = tempValue;
  69.  
  70. columna++;
  71. }
  72. }
  73. }
  74.  
  75. return orden;
  76. }
  77.  
  78. void ImprimirMatriz(Mat *matriz, unsigned int orden) {
  79. for(unsigned int fila = 0; fila < orden; fila++) {
  80. for(unsigned int columna = 0; columna < orden; columna++) {
  81. printf("\nEl elemento cuya fila es %u y cuya columna es %u tiene el valor de %i", fila, columna, matriz->elements[fila][columna]);
  82. }
  83. }
  84. }