#include <stdio.h>
int* fun();
int main()
{
int *j,d =5;
j = fun();
printf("%d\n",d);//If I comment this statement then the program gives //correct ouput for k i.e. 35, but if this line stays it gives garbage value
printf("%d\n",*j);
return 0;
}
int *fun()
{
int k = 35;
return (&k);
}
If I comment the above given statement printf("%d\n",d) then the program gives correct ouput for k i.e. 35, but if this line stays it gives garbage value.
What's up with that?
When you call fun() at line 9, fun() allocates local storage for k. When fun() exits, k goes out of scope and it is no longer legal to reference what was at the local where k was stored. However, depending on machine architecture and compiler optimization, when fun() returns, the location where k was stored may not necessarily be overwritten. When printf is called at line 10, printf will allocate it's own local storage. Simply allocating that local storage won't necessarily overwrite the address where k was stored. However, when printf writes to its local storage it very well may overwrite the storage where k was stored.
edit: In any case, as Cubbi stated, the behavior is undefined.