Autor
|
Tema: Matriz dinámica (Leído 4,499 veces)
|
agrichi
Desconectado
Mensajes: 9
|
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; }
|
|
|
En línea
|
|
|
|
CalgaryCorpus
|
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.
|
|
« Última modificación: 15 Diciembre 2017, 18:28 pm por CalgaryCorpus »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
« Última modificación: 16 Diciembre 2017, 20:36 pm por MAFUS »
|
En línea
|
|
|
|
agrichi
Desconectado
Mensajes: 9
|
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!! // Programa que reserva memoria dinámicamente para una matriz de X filas, y para cada fila Y columnas #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { int **punmem,i,j,k,filas,columnas; printf("Ingrese la cantidad de 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"); } for(i=0;i<filas;i++) { printf("\n\nCantidad de elementos de la fila %d: ",i +1); *(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"); } for(j=0;j<columnas;j++) { printf("Elemento[%d][%d]: ",i +1,j +1); scanf("%d",((*punmem )+i *columnas +j )); } printf("\nElementos de la fila %d:\n",i +1); for(k=0;k<columnas;k++) printf("%d ",(*((*punmem )+i *columnas +k ))); } for(i=0;i<filas;i++) for(i=0;i<filas;i++) (*(punmem+i))=NULL; punmem=NULL; return 0; }
|
|
|
En línea
|
|
|
|
CalgaryCorpus
|
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 &punmem[i][j] (linea 35)
o punmen[i][k] (linea 39)
, 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.
|
|
« Última modificación: 17 Diciembre 2017, 01:29 am por CalgaryCorpus »
|
En línea
|
|
|
|
agrichi
Desconectado
Mensajes: 9
|
Al fin lo conseguí Este es el programa #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { int **punmem,i,j,k,filas,columnas; printf("Ingrese la cantidad de 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"); } for(i=0;i<filas;i++) { printf("\n\nCantidad de elementos de la fila %d: ",i +1); *(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"); } for(j=0;j<columnas;j++) { printf("Elemento[%d][%d]: ",i +1,j +1); scanf("%d",((*(punmem +i ))+j )); // LINEA MODIFICADA } printf("\nElementos de la fila %d:\n",i +1); for(k=0;k<columnas;k++) printf("%d ",*(k +(*(punmem +i )))); // LINEA MODIFICADA } for(i=0;i<filas;i++) for(i=0;i<filas;i++) (*(punmem+i))=NULL; punmem=NULL; return 0; }
He modificado dos líneas, la 33 y la 37, ahora funciona Gracias a todos por los aportes!!
|
|
|
En línea
|
|
|
|
CalgaryCorpus
|
Tambien modificaste la peticion de memoria en la linea 10.
|
|
|
En línea
|
|
|
|
agrichi
Desconectado
Mensajes: 9
|
Es verdad, me había olvidado!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
lista con matriz dinamica
Programación C/C++
|
L·Storm!
|
2
|
4,488
|
3 Agosto 2011, 03:03 am
por L·Storm!
|
|
|
Expandir matriz dinámica?
Programación C/C++
|
Metal-byte
|
2
|
6,323
|
22 Enero 2012, 23:06 pm
por rir3760
|
|
|
Memoria dinamica matriz
Programación C/C++
|
programacion_c
|
1
|
3,098
|
25 Abril 2012, 00:23 am
por david_BS
|
|
|
Problema con matriz dinámica
Programación C/C++
|
NathanD
|
4
|
3,080
|
31 Mayo 2013, 17:26 pm
por rir3760
|
|
|
Juego con matriz dinámica en c++, función para rrecorrer matriz
Programación C/C++
|
jajaimess
|
1
|
4,064
|
21 Junio 2014, 05:21 am
por .:UND3R:.
|
|