In our lecture we had the following example:
int *foo(int x) {
    return &x;
}
int* pt = foo(x);
*pt = 17;
It was shown as a bad example, but not further explained. Why is this bad?
In our lecture we had the following example:
int *foo(int x) {
    return &x;
}
int* pt = foo(x);
*pt = 17;
It was shown as a bad example, but not further explained. Why is this bad?
 
    
     
    
    Bad thing is that you are returning a pointer to an automatic local variable. It will no longer be exist once function returns and then the statement *pt = 17; will cause program to behave erratically.   
A pointer to static local variable can be returned.   
int *foo() {
    static int x;
    return &x;
}
int* pt = foo();
*pt = 17; 
 
    
    In foo the variable x is local hence it ceases to exist after the method exits.  When a function returns, its automatic, local variables are discarded, so the returned pointer in this case is invalid (it points to an array that no longer exists). 
int* pt = foo(x);
*pt = 17; 
Hence, now access to pt results in Undefined Behavior. You should malloc it instead:
int *foo() 
{
    int *x = malloc(sizeof(int));
    *x = 0;
    return x;
}
int* pt = foo();
*pt = 17;
free(pt);
 
    
    Here
int *foo(int x) {
x is a local, non-static variable. By doing
return &x;
you return the address of the local variable x. It exists as long as the function does , and when the function exits, this address will be invalid for you to play with. By using
*pt = 17;
you dereference this address and write 17 to this invalid memory location. This triggers Undefined Behavior. This is why the given code is bad.
