4pie0
4pie0

Reputation: 29724

returning static pointer to local variable from function

I've found this code on web as an example, but I think this is not correct. An address to automatic variable is returned and this is just coincidence that it might work sometimes:

returning a pointer to an destroyed local variable, which becomes invalid memory location, is undefined behavior.

My only little hesitancy is about the pointer being static, but I think this changes nothing as this is the variable that should be static not a pointer: local variable is going to be destroyed. Can you please confirm or deny?

double *& showNumber()
{
    double n = 1550.85;
    static double *v = &n;
    return v;
}

int main(int argc, char *argv[])
{
    double sn = *showNumber();
    sn = *showNumber();
    //...
}

Upvotes: 3

Views: 2572

Answers (5)

rajendra shinde
rajendra shinde

Reputation: 41

Independent of local or global, static variable will live till the end of program. but it is recommenced that to use global when we return the value of that variable. because static local may get affected due to threads.

Upvotes: 0

Vlad from Moscow
Vlad from Moscow

Reputation: 310950

Your code has still undefined behaviour because the value of the static pointer is invalid after exiting the function. The local variable refered to by the pointer will be destroyed.And any next time when the function will be called the address of this local variable can be different.

You could write your function the following way

double * showNumber()
{
    static double n = 1550.85;
    return &n;
}

In this case the returned pointer would contain the same valid value.

Upvotes: 2

Marco A.
Marco A.

Reputation: 43662

Static variables persist for the entire duration of the program as soon as you initialize them. You're all set for v, but not for n's address.

Upvotes: 1

Pranit Kothari
Pranit Kothari

Reputation: 9841

If pointer and it's variable both are static then only code will be OK. Otherwise local variable will anyway going to die.

Upvotes: 0

NPE
NPE

Reputation: 500267

For this code to be well-defined, both n and v would need to be static.

Right now, the *showNumber() has undefined behaviour as it dereferences a dangling pointer.

Upvotes: 2

Related Questions