Título: Matriz dinámica Publicado por: agrichi en 15 Diciembre 2017, 18:19 pm Hola, Hice un programa que reserva memoria dinamicamente para una matriz, funciona bien hasta el final, ahí da error. Alguien sabe donde está el problema?
¿Está bien hecha la liberación de memoria al final del programa?? Gracias!! #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { int **punmem,i,j,k,filas,columnas; printf("Ingrese la cantidad de filas: "); scanf("%d",&filas); punmem=(int **)malloc(filas*sizeof(int*)); if(punmem==NULL) { printf("Error al reservar memoria\n\n"); printf("Presione una tecla para salir\n\n"); getch(); exit(1); } for(i=0;i<filas;i++) { printf("\n\nCantidad de elementos de la fila %d: ",i+1); scanf("%d",&columnas); *(punmem+i)=(int *)malloc(columnas*sizeof(int)); if(*(punmem+i)==NULL) { printf("Error al reservar memoria\n\n"); printf("Presione una tecla para salir\n\n"); getch(); exit(1); } for(j=0;j<columnas;j++) { printf("Elemento[%d][%d]: ",i+1,j+1); scanf("%d",((*punmem)+i*columnas+j)); // Se puede poner &punmem[j] } printf("\nElementos de la fila %d:\n",i+1); for(k=0;k<columnas;k++) printf("%d ",(*((*punmem)+i*columnas+k))); } printf("\n\n\n"); for(i=0;i<filas;i++) free(*(punmem+i)); for(i=0;i<filas;i++) (*(punmem+i))=NULL; free(punmem); punmem=NULL; return 0; } Título: Re: Matriz dinámica Publicado por: CalgaryCorpus en 15 Diciembre 2017, 18:26 pm Si dices cual es el error, ayudara' a ayudarte.
Tambien ayuda si encierras tu codigo usando el "Codigo GeSHI" que aparece cuando editas el mensaje. Usalo. El programa se vera mejor, tendra numeros de linea, etc. Título: Re: Matriz dinámica Publicado por: MAFUS en 16 Diciembre 2017, 13:17 pm Te quitarías de problemas si en vez de usar aritmética de punteros lo hicieras con subíndices, como si se tratara de un array. Así solo te tendrías que preocupar del elemento y no de dónde está.
No tengo máquina para probar pero esta línea no me gusta scanf("%d",((*punmem)+i*columnas+j)); Cuando un poco más arriba lo has hecho de esta forma *(punmem+i)=(int *)malloc(columnas*sizeof(int)); Fíjate en los paréntesis. Título: Re: Matriz dinámica Publicado por: agrichi en 16 Diciembre 2017, 20:30 pm Aquí pongo el programa con los números de línea
Cuando ejecuto el programa va todo bien pero al final me aparece un mensaje que dice que se escribió fuera de la zona de memoria del buffer "heap" ¿Donde está el error en el co´digo? Gracias!! Código
Título: Re: Matriz dinámica Publicado por: CalgaryCorpus en 16 Diciembre 2017, 21:27 pm Cuando pides memoria, tienes 2 opciones:
- pides memoria para todos los enteros de una vez, considerando todas las filas y columnas, como si fuera un gran arreglo contiguo y luego haces la aritmetica tu mismo. - pides memoria para distintas filas, cada fila es un arreglo unidimensional. Para este caso, pides memoria para direcciones de memoria por cada fila (como CASI lo haces en la linea 12, CASI porque pides memoria para enteros, no para direcciones de memoria) y luego pides memoria para todos los elementos en cada fila, como bien lo haces en la linea 24. Como has decidido la 2da opcion (pedir memoria por filas): 1. Cambia la linea 12 para que diga sizeof(int *) en vez de sizeof(int) 2. Luego creo que podrias usar Código o Código , sin hacer la aritmetica explicita que haces. La aritmetica que haces tiene solo sentido si en la linea 12 en vez de pedir memoria para 1 fila, pides memoria para todas las filas y columnas. No es el caso, veo que estas intentando acceder a memoria mas alla de lo que has solicitado. Título: Re: Matriz dinámica Publicado por: agrichi en 18 Diciembre 2017, 12:13 pm Al fin lo conseguí
Este es el programa Código
He modificado dos líneas, la 33 y la 37, ahora funciona Gracias a todos por los aportes!! Título: Re: Matriz dinámica Publicado por: CalgaryCorpus en 18 Diciembre 2017, 13:35 pm Tambien modificaste la peticion de memoria en la linea 10.
Título: Re: Matriz dinámica Publicado por: agrichi en 18 Diciembre 2017, 15:36 pm Es verdad, me había olvidado!
|