elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Matriz dinámica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Matriz dinámica  (Leído 4,064 veces)
agrichi

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Matriz dinámica
« 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;
}


En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Matriz dinámica
« Respuesta #1 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.


« Última modificación: 15 Diciembre 2017, 18:28 pm por CalgaryCorpus » En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Matriz dinámica
« Respuesta #2 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.
« Última modificación: 16 Diciembre 2017, 20:36 pm por MAFUS » En línea

agrichi

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Matriz dinámica
« Respuesta #3 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
  1. // Programa que reserva memoria dinámicamente para una matriz de X filas, y para cada fila Y columnas
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <conio.h>
  6.  
  7. int main()
  8. {
  9. int **punmem,i,j,k,filas,columnas;
  10. printf("Ingrese la cantidad de filas: ");
  11. scanf("%d",&filas);
  12. punmem=(int **)malloc(filas*sizeof(int));
  13. if(punmem==NULL)
  14. {
  15.  printf("Error al reservar memoria\n\n");
  16.  printf("Presione una tecla para salir\n\n");
  17.  getch();
  18.  exit(1);
  19. }
  20. for(i=0;i<filas;i++)
  21. {
  22.  printf("\n\nCantidad de elementos de la fila %d: ",i+1);
  23.  scanf("%d",&columnas);
  24.  *(punmem+i)=(int *)malloc(columnas*sizeof(int));
  25.  if(*(punmem+i)==NULL)
  26.  {
  27.   printf("Error al reservar memoria\n\n");
  28.   printf("Presione una tecla para salir\n\n");
  29.   getch();
  30.   exit(1);
  31.  }  
  32.  for(j=0;j<columnas;j++)  
  33.  {
  34.   printf("Elemento[%d][%d]: ",i+1,j+1);
  35.   scanf("%d",((*punmem)+i*columnas+j));
  36.  }
  37.  printf("\nElementos de la fila %d:\n",i+1);
  38.  for(k=0;k<columnas;k++)
  39.   printf("%d ",(*((*punmem)+i*columnas+k)));
  40. }
  41. printf("\n\n\n");
  42. for(i=0;i<filas;i++)
  43.  free(*(punmem+i));
  44. for(i=0;i<filas;i++)
  45.  (*(punmem+i))=NULL;
  46. free(punmem);
  47. punmem=NULL;
  48. return 0;
  49. }
  50.  
  51.  
  52.  
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Matriz dinámica
« Respuesta #4 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
  1. &punmem[i][j] (linea 35)
  o
Código
  1. 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

Aqui mi perfil en LinkedIn, invitame un cafe aqui
agrichi

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Matriz dinámica
« Respuesta #5 en: 18 Diciembre 2017, 12:13 pm »

Al fin lo conseguí
Este es el programa

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. int main()
  6. {
  7. int **punmem,i,j,k,filas,columnas;
  8. printf("Ingrese la cantidad de filas: ");
  9. scanf("%d",&filas);
  10. punmem=(int **)malloc(filas*sizeof(int *));
  11. if(punmem==NULL)
  12. {
  13.  printf("Error al reservar memoria\n\n");
  14.  printf("Presione una tecla para salir\n\n");
  15.  getch();
  16.  exit(1);
  17. }
  18. for(i=0;i<filas;i++)
  19. {
  20.  printf("\n\nCantidad de elementos de la fila %d: ",i+1);
  21.  scanf("%d",&columnas);
  22.  *(punmem+i)=(int *)malloc(columnas*sizeof(int));
  23.  if(*(punmem+i)==NULL)
  24.  {
  25.   printf("Error al reservar memoria\n\n");
  26.   printf("Presione una tecla para salir\n\n");
  27.   getch();
  28.   exit(1);
  29.  }  
  30.  for(j=0;j<columnas;j++)  
  31.  {
  32.   printf("Elemento[%d][%d]: ",i+1,j+1);
  33.   scanf("%d",((*(punmem+i))+j));         // LINEA MODIFICADA                
  34.  }
  35.  printf("\nElementos de la fila %d:\n",i+1);
  36.  for(k=0;k<columnas;k++)
  37.   printf("%d ",*(k+(*(punmem+i))));     // LINEA MODIFICADA
  38. }
  39. printf("\n\n\n");
  40. for(i=0;i<filas;i++)
  41.  free(*(punmem+i));
  42. for(i=0;i<filas;i++)
  43.  (*(punmem+i))=NULL;
  44. free(punmem);
  45. punmem=NULL;
  46. return 0;
  47. }
  48.  
  49.  
  50.  

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

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Matriz dinámica
« Respuesta #6 en: 18 Diciembre 2017, 13:35 pm »

Tambien modificaste la peticion de memoria en la linea 10.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
agrichi

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Matriz dinámica
« Respuesta #7 en: 18 Diciembre 2017, 15:36 pm »

Es verdad, me había olvidado!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
lista con matriz dinamica
Programación C/C++
L·Storm! 2 4,063 Último mensaje 3 Agosto 2011, 03:03 am
por L·Storm!
Expandir matriz dinámica?
Programación C/C++
Metal-byte 2 5,717 Último mensaje 22 Enero 2012, 23:06 pm
por rir3760
Memoria dinamica matriz
Programación C/C++
programacion_c 1 2,802 Último mensaje 25 Abril 2012, 00:23 am
por david_BS
Problema con matriz dinámica
Programación C/C++
NathanD 4 2,718 Último mensaje 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 3,426 Último mensaje 21 Junio 2014, 05:21 am
por .:UND3R:.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines