Matriz dinámica

Iniciado por agrichi, 15 Diciembre 2017, 18:19 PM

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

agrichi

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;
}

CalgaryCorpus

#1
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.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

MAFUS

#2
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.

agrichi

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: ");
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));
  }
  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;
}



CalgaryCorpus

#4
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.


Aqui mi perfil en LinkedIn, invitame un cafe aqui

agrichi

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: ");
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))+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
}
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;
}




He modificado dos líneas, la 33 y la 37, ahora funciona
Gracias a todos por los aportes!!

CalgaryCorpus

Tambien modificaste la peticion de memoria en la linea 10.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

agrichi

Es verdad, me había olvidado!