SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: mido_666 en Viernes 12 de Diciembre de 2003, 18:29

Título: Problemas Con Malloc() Y Free()
Publicado por: mido_666 en Viernes 12 de Diciembre de 2003, 18:29
Saludos y gracias por adelantado.
En el siguiente código (espero lo entiendan):
Código: Text
  1.  
  2. #include <stdio.h>
  3.  
  4. int main(void)
  5. {
  6. float *bufferFloat;
  7. int num, i;
  8.  
  9. /*Lee el numero de datos que se van a introducir y despues pide los
  10.   valores*/
  11. printf ("\nCuántos valores va a introducir? ");
  12. scanf ("%d", &num);
  13. bufferFloat = (float *) malloc (sizeof(float) * num);
  14.  
  15. for (i=0;i<num;i++)
  16. {
  17. printf ("Introduzca el valor numero %d: ", i+1);
  18. scanf ("%f", (bufferFloat + i));
  19. }
  20.  
  21. for (i=0;i<num;i++)
  22. {
  23. printf ("El valor numero %d que introdujo fue ----> %f\n", i+1, *(bufferFloat+i));
  24. free(bufferFloat +i);
  25. }
  26.  
  27. return 0;
  28. }
  29.  
  30.  

Por qué al ejecutar el código, cuando introduzco que el numero de valores es mayor a 3, ¿por qué salta error de Violación de segmento al ejecutarse el free con i mayor a 3?
He probado y el programa funciona perfectamente (introduciendo los datos adecuados) si omito la parte del código de free.

Miguel desde Soria.
Título: Re: Problemas Con Malloc() Y Free()
Publicado por: Martin Candurra en Viernes 12 de Diciembre de 2003, 18:49
Sabes cual es el problema, vos estas haciendo un solo malloc, por lo que basta un solo free para liberar.
Si vos hubieras hecho un
for(i=0; i<num; i++)
    bufferfloat+i = (float *) malloc ( sizeof(float));

estaria bien liberar como lo estas haciendo, pero al pedir un solo bloque de tamaño num * sizeof(float) basta con que liberes solo la direccion que obtuviste.

Espero haber sido claro.
Saludos.
Título: Re: Problemas Con Malloc() Y Free()
Publicado por: mido_666 en Viernes 12 de Diciembre de 2003, 18:55
Muchas gracias ya solucioné el problema.
Por su puesto fuiste muy claro y conciso, te agrezco otra vez el tiempo empleado.

Miguel.