C/Visual C - malloc() y free()

   
Vista:

malloc() y free()

Publicado por Clayder (16 intervenciones) el 07/10/2008 08:16:27
Hola:

Estoy teniendo problemas para entender el comportamiento de estas dos funciones. En el caso especifico de los siguientes ejemplos:

int* funcion_1()
{
int n1;
int n2;
int* s;
s[0] = 5;
return s;
}

....
int *n = funcion1();
printf("%d", n[0]);
....

En la linea que imprimo el valor 0 de de n, me da el resultado correcto, osea 5. Sin embargo si en la funcion: funcion_1(), le quito las declaraciones de:

int n1;
int n2;

Sale un error, a menos que reserve espacio de memoria para "s" con malloc() o new, lo cual parece logico. Entonces ¿por que sucede esto cuando declaro variables antes de declarar el puntero y este pareciera ya no necesitar que le reserven espacio de memoria?, porque el malloc() se usa a la par con los punteros, no?

Mi otra duda, es con respecto a la funcion free(). Es decir, se supone que libera espacio reservado antes, no?, pero si tuviera un puntero:

int *n = (int*)malloc(sizeof(int));
//free(n);
n[0] = 14;
printf("%d", n[0]);

No se supone que ¿si le hiciera free(n)(linea comentada), ya no deberia imprimir el valor n[0], puesto que ya no tiene nada?, o en todo caso ¿como funciona free() exactamente?

Disculparan las multiples preguntas, pero me llene de dudas.

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:malloc() y free()

Publicado por Tom (481 intervenciones) el 07/10/2008 09:29:47
Necesitas repasar tus conceptos sobre programación en C. Hay muy buenos tutoriales por la red, por ejemplo mira aquí:

http://www.elrincondelc.com/cursoc/cursoc.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

estas accesando a memoria que no esta reservada

Publicado por AntonioG (42 intervenciones) el 07/10/2008 20:05:20
Hola,

Lo que pasa en ambos casos es que estas accesando a memoria que no debes. O sea, o no esta reservada o ya la liberaste.

En el primer caso, al parecr esta usando la memoria reservada para las otras variables para guardar el dato.

En el segundo caso, aun cuando ya se haya liberado la memoria, pues sigue conteniendo la informacion, asi que , como tu lo hacfes, las puedes accesar sin problemas. El problema vendria cuando declares otrra variable, proque puede usar ese espacio que ya esta libre y entonces perderias el 14.

En resumen, pide memoria con malloc y liberala con free. Si liberas una memoria no accedas mas a ella. Si no haces eso puede que funcione tu programa correctamente, peor puede que no, porque estas jugando con memoria que no te correposnde :)

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar