Dirección de retorno de la variable local en C

Resuelto mary asked hace 12 años • 5 respuestas

Digamos que tengo las siguientes dos funciones:

1

int * foo()
{
  int b=8;
  int * temp=&b;
  return temp;
}

2

int * foo()
{
   int b=8;
   return &b;
}

No recibo ninguna advertencia para el primero (por ejemplo, la función devuelve la dirección de una variable local ), pero sé que esto es ilegal ya que bdesaparece de la pila y nos queda un puntero a la memoria indefinida.

Entonces, ¿cuándo debo tener cuidado al devolver la dirección de un valor temporal?

mary avatar Jan 05 '12 20:01 mary
Aceptado

La razón por la que no recibe una advertencia en el primer fragmento es porque no está devolviendo (desde la perspectiva del compilador) una dirección a una variable local.

Estás devolviendo el valor de int * temp. Aunque esta variable podría contener (y en este ejemplo contiene) un valor que es una dirección de una variable local, el compilador no subirá a la pila de ejecución de código para ver si este es el caso.

Nota : Ambos fragmentos son igualmente malos, aunque su compilador no le advierte sobre el primero. No utilice este enfoque.


Siempre debes tener cuidado al devolver direcciones a variables locales; por regla general, se podría decir que nunca debería hacerlo.

staticSin embargo, las variables son un caso completamente diferente, que se analiza en este hilo .

Filip Roséen - refp avatar Jan 05 '2012 13:01 Filip Roséen - refp

Yo diría que puede devolver la variable local o más bien punteros a ella si malloc la asignó dinámicamente.

En ese caso, la memoria utilizada para almacenar variables quiere estar en la pila, pero en el montón y no se borrará ni se reutilizará después de salir de la función, como ocurre en el caso de las variables locales automáticas (creadas sin malloc). ¿Estoy en lo cierto?

user989583 avatar Jan 05 '2012 14:01 user989583