Autor Tema: Problemon con malloc y free  (Leído 5355 veces)

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

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Problemon con malloc y free
« en: 07 de Marzo de 2008, 01:43:15 »
Hola ... tengo un problema de los buenos ...  :( ... de esos que te rompen el coco ....

Resulta que tengo un funcion que realiza un conjunto de operaciones sobre un arreglo de datos, resulta que este arreglo de datos no tiene un tamano fijo y para poder hacer la operaciones debo crear primero varios buffers en memoria dinamica.

Tengo algo como asi:

Código: [Seleccionar]
void Assign_ptrs( char * file, char tamano )
{

     
     unsigned int * a_file_0 = (unsigned int * ) malloc( tamano * 2 );
     unsigned int * a_file_1 = (unsigned int * ) malloc( tamano * 4 );


      .......

       Realizo la operaciones ....

      .......


     free( a_file_0 );
     free( a_file_1 );


}


Todo sale bien cuando se ejecuta la rutina una vez ... pero cuando llamo la rutina por segunda vez el condenado pic se reinicia despues de la linea donde esta el malloc ....

Ya revise todo .. el puntero a_file no cambia ... hay espacio suficiente ... etc ...

Estoy usando C30, el heap es de 4096 bytes y el stack minimo de 128 bytes ... no se cual es el problema puesto que esta es mi primera vez usando memoria dinamica en un microcontrolador  ... ayuda por favor!!!!

« Última modificación: 07 de Marzo de 2008, 04:10:47 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Problemon con malloc y free
« Respuesta #1 en: 07 de Marzo de 2008, 04:12:57 »
Ok ... ya revisando mejor. El problema se da cuando hay dos malloc dentro de la rutina .... pero porque esto es asi ???? .... lo solucione usando un malloc mas grande ... en vez de dos pequenos ....

Pero todavia no entiendo el problema ... si la primera vez lo hace bien pero no asi la segunda !

Control Automático, DSP & Microcontroladores

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Problemon con malloc y free
« Respuesta #2 en: 12 de Marzo de 2008, 20:00:50 »
Nose, a lo mejor mi solucion no sea tan elegante pero no veo por qué no tenga que funcionar:

     unsigned int * a_file_0[tamano*2];
     unsigned int * a_file_1[tamano*4];

Segun tengo entendido, las variables locales son memoria dinamica de por si... cuando sales de una funcion la memoria supuestamente se libera... cosa que no ocurre con las variables globales, donde yo veo mas justificado el uso de malloc.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Problemon con malloc y free
« Respuesta #3 en: 12 de Marzo de 2008, 20:06:27 »
Mmmm dejame revisar ... no soy muy experto en este tema ... pero muchas gracias por la sugerencia!

Control Automático, DSP & Microcontroladores

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Problemon con malloc y free
« Respuesta #4 en: 12 de Marzo de 2008, 20:18:27 »
Muchas gracias por tu sugerencia ... la verdad no sabia que se podian hacer declaraciones dinamicas de arreglos ...  :lol: :lol: pero bien ... todos los dias se aprende algo nuevo ... :-/


Solo me falta probar el programita  ....

 
Control Automático, DSP & Microcontroladores

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problemon con malloc y free
« Respuesta #5 en: 13 de Marzo de 2008, 08:10:35 »
¿Te ha funcionado Blackcat?
Es muy elegante la solución de Manex, pero me gustaría saber si furula.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Problemon con malloc y free
« Respuesta #6 en: 13 de Marzo de 2008, 11:10:41 »
Citar
Segun tengo entendido, las variables locales son memoria dinamica de por si... cuando sales de una funcion la memoria supuestamente se libera.
Digamos que si, las variables locales se gestionan desde el Stack, y son liberadas automaticamente al salir de la funcion, se dice automatica porque al regresar de la funcion o subrutina el Stack toma el valor siguiente a la funcion llamadora.

Citar
cosa que no ocurre con las variables globales, donde yo veo mas justificado el uso de malloc.
Exacto, el uso de malloc se aplica a variables globales que no necesitan tener tanta persistencia en el tiempo, es decir una variables que solo es utilizada por 2 o mas funciones, pero despues no se va a utilizar mas, su uso optimiza el uso de la RAM.

Citar
Nose, a lo mejor mi solucion no sea tan elegante pero no veo por qué no tenga que funcionar:

     unsigned int * a_file_0[tamano*2];
     unsigned int * a_file_1[tamano*4];

En ANSI C esto no se puede hacer, el tamaño del indice tiene que ser constante al momento de la compilacion, nose en C30, por otro lado hay que tener en cuenta el tamaño del Stack para asignar arrays de esta manera, sino un stack overflow puede producirse.
Saludos !




Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Problemon con malloc y free
« Respuesta #7 en: 13 de Marzo de 2008, 23:09:13 »
Bueno les comento:

Si funciono el código que me dijo MANEX:

     unsigned int * a_file_0[tamano*2];
     unsigned int * a_file_1[tamano*4];

claro las variables son locales y no tiene problemas. .. al igual que RICHI777 yo también pensaba que eso no se podía hacer .. pero resultó que si funciona y muy bien ... no me da problemas esa parte de código ... Revise de arriba para abajo el libro de "El Lenguaje de Programacion C" de Brian W. Kernighan y Dennis M. Ritchie y no dice nada al respecto ..  :?


Pero el problema todavia persiste si hay dos malloc consecutivos!





« Última modificación: 13 de Marzo de 2008, 23:13:45 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Problemon con malloc y free
« Respuesta #8 en: 19 de Octubre de 2008, 23:03:07 »
Queria rescatar este tema del fondo ... otra vez ...

Siempre tengo problemas cuando hago esto:

Código: [Seleccionar]
void  main (void)
{

void * ptr1 = malloc( 4 );
void * ptr2 = malloc( 8 );

       .....

}

El primer malloc lo hace bien ... el segundo da error ... ¿¿porque??
Control Automático, DSP & Microcontroladores

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Problemon con malloc y free
« Respuesta #9 en: 02 de Noviembre de 2008, 01:28:00 »
 :-/

JA!! Yo sabia que habia algo malo ... ya pensaba que me estaba volviendo loco, esto es lo que dice el FIXED ISSUES de la nueva version 3.11 de C30

C30-505 - malloc() fails even though there is enough heap available

Con el 3.11 ya no da error !!  :P :P :P
« Última modificación: 02 de Noviembre de 2008, 01:30:58 por blackcat »
Control Automático, DSP & Microcontroladores


 

anything