[C] Memoria dinámica. Malloc, Realloc

Iniciado por GGZ, 19 Noviembre 2015, 00:47 AM

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

GGZ

Hola a todos!

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

/*
Escribir un programa que lea enteros y los almacene en un arreglo
sin conocer de antemano la cantidad de valores que se leerán.
El programa deberá completar el arreglo hasta que se ingrese un número negativo,
valor que no se agregará a la mencionada estructura de datos. Finalmente deberá imprimir
el promedio de los elementos del arreglo.
*/

#include <stdio.h>
#include <stdlib.h>


int main (void){
int a,promedio;
int i;
int *AR=malloc (1*sizeof(int));
int *tmp_AR;

i=promedio=0;
printf ("Number no negative: \n");
scanf ("%d",&AR[i]);
while (AR[i]>=0) {
promedio+=AR[i];
scanf ("%d",&AR[i]);

tmp_AR=realloc(AR,(1+i)*sizeof(int));
if (tmp_AR == NULL){
// Falló la asignación de memoria.
exit (-1);
}
else {  
// Asignar memoria a AR
AR=tmp_AR;
}
i++;
}

printf ("Average: %f\n",(double)promedio);




return 0;
}


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!
LET'S DO STUFF!!

GGZ

/*
Escribir un programa que lea enteros y los almacene en un arreglo
sin conocer de antemano la cantidad de valores que se leerán.
El programa deberá completar el arreglo hasta que se ingrese un número negativo,
valor que no se agregará a la mencionada estructura de datos. Finalmente deberá imprimir
el promedio de los elementos del arreglo.
*/

#include <stdio.h>
#include <stdlib.h>


int main (void){
int promedio;
int i;
int *AR=malloc(1*sizeof(int));
int *AR_tmp;

i=promedio=0;


printf ("Introduce un numero positivo: \n");
scanf ("%d",&AR[i]);


while (AR[i]>=0){
promedio+=AR[i];
i++;
AR_tmp = realloc(AR, (1+i) * sizeof(int));
if (AR_tmp==NULL){free(AR_tmp); exit(1);}

AR=AR_tmp;
// Ya no lo necesitamos.
AR_tmp=NULL;
scanf ("%d",&AR[i]);
printf ("Tamaño de a: %lu\n",sizeof(AR));
}
printf ("Promedio: %f\n",(double)promedio/(i));

free(AR);


return 0;
}


Listo!
LET'S DO STUFF!!