Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: GGZ en 19 Noviembre 2015, 00:47 am



Título: [C] Memoria dinámica. Malloc, Realloc
Publicado por: GGZ en 19 Noviembre 2015, 00:47 am
Hola a todos!

Me tira un error, en realidad no sé bien como usar realloc.

Código
  1. /*
  2. Escribir un programa que lea enteros y los almacene en un arreglo
  3. sin conocer de antemano la cantidad de valores que se leerán.
  4. El programa deberá completar el arreglo hasta que se ingrese un número negativo,
  5. valor que no se agregará a la mencionada estructura de datos. Finalmente deberá imprimir
  6. el promedio de los elementos del arreglo.
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11.  
  12.  
  13. int main (void){
  14. int a,promedio;
  15. int i;
  16. int *AR=malloc (1*sizeof(int));
  17. int *tmp_AR;
  18.  
  19. i=promedio=0;
  20. printf ("Number no negative: \n");
  21. scanf ("%d",&AR[i]);
  22. while (AR[i]>=0) {
  23. promedio+=AR[i];
  24. scanf ("%d",&AR[i]);
  25.  
  26. tmp_AR=realloc(AR,(1+i)*sizeof(int));
  27. if (tmp_AR == NULL){
  28. // Falló la asignación de memoria.
  29. exit (-1);
  30. }
  31. else {  
  32. // Asignar memoria a AR
  33. AR=tmp_AR;
  34. }
  35. i++;
  36. }
  37.  
  38. printf ("Average: %f\n",(double)promedio);
  39.  
  40.  
  41.  
  42.  
  43. return 0;
  44. }

Me tira este error : Error in `./12': realloc(): invalid next size: 0x0000000001a63010 ***

Y encima después me acepta numeros negativos no entiendo por qué

¿Cómo lo debería hacer?
Saludos!


Título: Re: [C] Memoria dinámica. Malloc, Realloc
Publicado por: GGZ en 19 Noviembre 2015, 01:44 am
Código
  1. /*
  2. Escribir un programa que lea enteros y los almacene en un arreglo
  3. sin conocer de antemano la cantidad de valores que se leerán.
  4. El programa deberá completar el arreglo hasta que se ingrese un número negativo,
  5. valor que no se agregará a la mencionada estructura de datos. Finalmente deberá imprimir
  6. el promedio de los elementos del arreglo.
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11.  
  12.  
  13. int main (void){
  14. int promedio;
  15. int i;
  16. int *AR=malloc(1*sizeof(int));
  17. int *AR_tmp;
  18.  
  19. i=promedio=0;
  20.  
  21.  
  22. printf ("Introduce un numero positivo: \n");
  23. scanf ("%d",&AR[i]);
  24.  
  25.  
  26. while (AR[i]>=0){
  27. promedio+=AR[i];
  28. i++;
  29. AR_tmp = realloc(AR, (1+i) * sizeof(int));
  30. if (AR_tmp==NULL){free(AR_tmp); exit(1);}
  31.  
  32. AR=AR_tmp;
  33. // Ya no lo necesitamos.
  34. AR_tmp=NULL;
  35. scanf ("%d",&AR[i]);
  36. printf ("Tamaño de a: %lu\n",sizeof(AR));
  37. }
  38. printf ("Promedio: %f\n",(double)promedio/(i));
  39.  
  40. free(AR);
  41.  
  42.  
  43. return 0;
  44. }

Listo!