Reputation: 29724
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
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
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
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
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
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