An object has a storage duration that determines its lifetime. There are three four storage durations: static, thread, automatic, and allocated.
According to the C Standard, section 6.2.4, paragraph 2 [ISO/IEC 9899:2011],
...
In this noncompliant code sample, the address of local variable c_str
is assigned to the variable p
, which has file scope. The assignment itself is legal, but it is illegal for c_str
to go out of scope while p
holds its address, as happens at the end of dont_do_this
()
.
Code Block | ||||
---|---|---|---|---|
| ||||
const char *p; void dont_do_this(void) { const char c_str[] = "This will change"; p = c_str; /* dangerous */ /* ... */ } void innocuous(void) { const char c_str[] = "Surprise, surprise"; } /* ... */ dont_do_this(); innocuous(); /* p might be pointing to "Surprise, surprise" */ |
...
In this compliant solution, p
is declared with the same scope as c_str
, preventing p
from taking on an indeterminate value outside of this_is_OK()
.
Code Block | ||||
---|---|---|---|---|
| ||||
void this_is_OK(void) { const char c_str[] = "Everything OK"; const char *p = c_str; /* ... */ } /* p is inaccessible outside the scope of string c_str */ |
Alternately, both p
and c_str
could be declared with static
scope.
...
If it is necessary for p
to be defined with file scope, but c_str
with a more limited scope, then p
can be set to NULL
before c_str
is destroyed. This practice prevents p
from taking on an indeterminate value, although any references to p
must check for NULL
.
Code Block | ||||
---|---|---|---|---|
| ||||
const char *p; void is_this_OK(void) { const char c_str[] = "Everything OK?"; p = c_str; /* ... */ p = NULL; } |
...