[C con Clase] Reserva dinamica memoria

Steven Davidson steven en conclase.net
Jue Mar 22 19:44:25 CET 2007


Hola Ismael,

El pasado 2007-03-22 17:53:25, Ismael escribió:

I> Se trata de un programa que declara un puntero a int en la funcion 
I> principal, con el fin de simular un array. Se pide el numero de elementos q 
I> desea el usuario. Este numero y el puntero se lepasa a una funcion, para 
I> hacer la reserva dinamica de mem con malloc. Despues se pasa el puntero y el 
I> numero de elemntos a una fucnion para rellenar el array por teclado... y ahi 
I> surge el tipico problema de apuntamiento indebido. ?Por qué?
I> Este es el código (empleo Dev-C++:

[CORTE]

I> void reserva(int *dat, int n)
I> {
I>    dat = (int *)malloc(sizeof(int)*n);
I> }

Aquí está el problema. Recuerda que los parámetros son pasados por copia. Por lo tanto, 'dat' en 'reserva()' es una copia del puntero 'dat' en 'main()'. Esto implica que cualquier modificación a "este" 'dat' no afectará el puntero 'dat' original. La solución, en C, es recibir la dirección de memoria del puntero 'dat'; o sea, un doble puntero. Esto es,

void reserva( int **dat, int n )
{
  *dat = (int *)malloc( sizeof(int)*n );
}

int main()
{
  int *dat;
  ...
  reserva( &dat, n );
  ...
}

Otra solución podría involucrar otro diseño de la función 'reserva()' para que retorne el puntero. Por ejemplo,

int *reserva( int n )
{
  return (int *)malloc( sizeof(int)*n );
}

int main()
{
  int *dat;
  ...
  dat = reserva( n );
  ...
}

También podríamos combinar ambos diseños. Por ejemplo,

int *reserva( int **dat, int n )
{
  return *dat = (int *)malloc( sizeof(int)*n );
}

int main()
{
  int *dat;
  ...
  if( !reserva( &dat, n ) )  exit(-1);
  ...
}


Espero haber aclarado la duda.

Steven


Más información sobre la lista de distribución Cconclase