PDA

Ver la versión completa : Me pasa algo raro con malloc



Locke
18/10/2004, 21:07
Ya ves, una funcion de las mas necesarias y me acabo de dar cuenta de que quizas no la sepa usar :D

A ver, segun tengo entendido simplemente reserva la cantidad de memoria en bytes y devuelve la direccion de la primera posicion. Me funciona bien excepto si el puntero donde almaceno el resultado es un argumento de la funcion desde donde llamo a malloc. Pongo un ejemplo:



void reserva_memoria (mi_variable *puntero)
{
puntero = (mi_variable *) malloc ( 5 * sizeof (mi_variable));
}


void principal ()
{
mi_variable *puntero = NULL;
reserva_memoria (puntero);
}

Alguna idea de por que puede fallar?

Muchas cenkius ;)

theNestruo
18/10/2004, 21:26
No te funciona porque "puntero" es un parámetro, es decir, es pasado por valor; al salir de la función no lo tendrás modificado.
Tienes que hacerlo así:


void reserva_memoria (mi_variable** puntero_a_puntero)
{
(*puntero_a_puntero)=(mi_variable*) malloc (5*sizeof (mi_variable));
}


void principal ()
{
mi_variable *puntero=NULL;
/* Le pasamos la dirección del puntero (es decir, un puntero a un puntero */
reserva_memoria (&puntero);
}


Por otra parte, te recomiendo que cambies a calloc para hacer reservas de memoria de arrays. No es que sea mejor que malloc, pero si está ahí, por algo será, ¿no?:


int *a=NULL, *b=NULL;
a=(int*) malloc (sizeof (int)); /* Un entero */
b=(int*) calloc (5, sizeof (int)); /* Un array de enteros */
/* ... */
free (a); a=NULL; /* Asignar NULL puede evitar problemas */
free (b); b=NULL;


He estado revisando unas cosas y he visto que efectivamente calloc es mejor que malloc, porque rellena con ceros la memoria asignada. Más información
aquí (http://www-ccs.ucsd.edu/c/stdlib.html#calloc).

Locke
18/10/2004, 21:36
Muchas gracias tio, yo lo flipo cada vez que pregunto, en 2 minutos me habeis respondido o tu o mortimor o nuak xD

Parece que estais aqui pa mi, en serio, muchas gracias ;)