(Ayuda) Programa crashea al acceder al último término de una matriz

Iniciado por Seyro97, 2 Octubre 2015, 07:41 AM

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

Seyro97

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 (cpp) [Seleccionar]
matriz = (int **)malloc(orden * sizeof(int));

if(matriz == (int **)0) {
printf("Error asignando memoria a la matriz (primer paso)");
return 0;
}

for(int i = 0; i < orden; i++) {
matriz[i] = (int *)malloc(orden * sizeof(int));

if(matriz[i] == (int *)0) {
printf("Error asignando memoria a la matriz (segundo paso)");
return 0;
}
}


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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
int tempValue;
int *tempPointer;

for(unsigned int fila = 0; fila < orden; fila++) {
for(unsigned int columna = 0; columna < orden;) {
printf("\nIntroduzca el elemento fila %u columna %u: ", fila, columna);

if(scanf("%i", &tempValue) == EOF) {
printf("\nLa proxima vez introduzca un numero valido.");
} else {
tempPointer = matriz[fila];
tempPointer[columna] = tempValue;

columna++;
}
}
}

Según el debugger, el programa crashea en
Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!

Seyro97

Ya sé en que me equivoqué jaja.

Os dejo el resultado:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

typedef struct {
int **elements;
} Mat;

unsigned int IngresarMatriz(Mat *matriz);
void ImprimirMatriz(Mat *matriz, unsigned int orden);

int main() {
unsigned int orden = 0;
Mat matriz;

orden = IngresarMatriz(&matriz);

if(orden == 0)
return 1;

printf("%p", matriz);

ImprimirMatriz(&matriz, orden);

for(int i = 0; i < orden; i++)
free((void *)matriz[i]);

free((void *)matriz);

return 0;
}

unsigned int IngresarMatriz(Mat *matriz) {
unsigned int orden;
int *tempPointer;
int tempValue;

printf("Introduzca el orden de la matriz cuadrada: ");

if(scanf("%u", &orden) == EOF) {
printf("\nLa proxima vez introduzca un numero valido.");
return 0;
}

matriz->elements = (int **)malloc(orden * sizeof(int));

if(matriz->elements == (int **)0) {
printf("Error asignando memoria a la matriz (primer paso)");
return 0;
}

for(int i = 0; i < orden; i++) {
matriz->elements[i] = (int *)malloc(orden * sizeof(int));

if(matriz->elements[i] == (int *)0) {
printf("Error asignando memoria a la matriz (segundo paso)");
return 0;
}
}

for(unsigned int fila = 0; fila < orden; fila++) {
for(unsigned int columna = 0; columna < orden;) {
printf("\nIntroduzca el elemento fila %u columna %u: ", fila, columna);

if(scanf("%i", &tempValue) == EOF) {
printf("\nLa proxima vez introduzca un numero valido.");
} else {
tempPointer = matriz->elements[fila];
tempPointer[columna] = tempValue;

columna++;
}
}
}

return orden;
}

void ImprimirMatriz(Mat *matriz, unsigned int orden) {
for(unsigned int fila = 0; fila < orden; fila++) {
for(unsigned int columna = 0; columna < orden; columna++) {
printf("\nEl elemento cuya fila es %u y cuya columna es %u tiene el valor de %i", fila, columna, matriz->elements[fila][columna]);
}
}
}
Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!