Ver Mensaje Individual
  #34 (permalink)  
Antiguo 15/08/2006, 21:14
Avatar de Instru
Instru
 
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
3)Regreso de referencia de una variable en una funcion.

Otro error comùn es este, regresar una referencia de una variable que esta dentro de una funcion:

int *funcion(void)
{
int valor;
//Calculo de valor
return &valor;
}

Este error no es muy comun, pero suele pasar.
Al invocar una funcion, y crear una variable dentro de esta, la varible es temporal, es decir, se destruye al terminar la funcion.
Entonces que pasa en este ejemplo? Simple. La funcion regresa la direccion de la varibale local temporal y despues destruye la variable. Entonces que pasa con la direccion? Pues queda apuntando a donde antes estaba esa variable, memoria que ahora puede estar en uso por otra variable o proceso.

Hay 2 formas de solucion este problema:

int *funcion(void)
{
int *valor;
valor=(int *)malloc(sizeof(int));
//Calculo de valor
return valor;
}

Esto asegurara que el espacio seguira apartado incluso al salir de la funcion, ya que la unica manera de liberar ese espacio es usando la funcion free(puntero);

La segunda manera es:

int *funcion(void)
{
static int valor;
//Calculo de valor
return &valor;
}

EL modificador static lo que hace es que la variable no sea destruida al terminar la funcion y gracias a esto, al regresar el valor y terminar la funcion, la variable valor seguira en su lugar y la direccion sera correcta.

...


Por hoy hasta aqui, para dudas y comentarios, usen otro post. Para corregirme mandenme un MP, no soy perfecto en la programacion de C pero trato de serlo, y la unica manera es que me corrijan cuando ando mal. Espero pronto poner mas sobre punteros ya que son la aparte mas poderosa que el lenguaje mas poderoso puede tener.

Saludos