En tu ejemplo no ves el valor de la variable i, ves el valor que tenia i y ahora es de a. Las variables locales a la función desaparecen del stack justo luego del return, por tanto no te impide retornar un dato por valor y asignarlo a otra variable en otro contexto de función. Si te impide retornar una referencia a una variable local y trabajar con esa referencia desde otro contexto, puesto que esa referencia apuntaría a un lugar donde los datos útiles podrían ya no existir.
Por ejemplo:
Saludos
Por ejemplo:
Código (c) [Seleccionar]
#include <stdio.h>
int* Test1(void)
{
int i=2;
return &i; //Retornando direccion de una variable local (Deberia dar un warning)
}
void Test2()
{
char Buff[20000];
}
int main()
{
int *Ptr;
Ptr=Test1();
//Ptr apunta a la direccion de i. i==2, ya no es valido en este punto. La direccion a la cual apunta Ptr puede contener datos inservibles.
Test2();
printf("%d",*Ptr); //Imprime dato basura
return 0;
}
Código (c) [Seleccionar]
#include <stdio.h>
int Test1(void)
{
int i=2;
printf("Local Address, i: %x\n",&i);
return i; //Retorno el valor de i.
}
void Test2()
{
char Buff[20000];
}
int main()
{
int Var;
Var=Test1();
//i==2, ya no es valido. En la direccion donde se encontraba i solo hay datos inservibles.
//El valor que tenia i, ahora se encuentra en Var.
Test2();
printf("Local Address, Var: %x\n",&Var);
printf("Dato Var: %d",Var); //Imprime dato correcto
return 0;
}
Saludos