diff options
| author | Craig Jennings <c@cjennings.net> | 2025-08-14 22:58:58 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2025-08-14 22:58:58 -0500 |
| commit | 82ba818ff456bcd6d56a06226e3f27e98fbb55c3 (patch) | |
| tree | 158cfc17b2f644a10f063cb546752cfaae12c97f /devdocs/c/language%2Flifetime.html | |
| parent | 9278ddd4ea1a8b1a4c1edaa8894516e3f48d245b (diff) | |
| download | dotemacs-82ba818ff456bcd6d56a06226e3f27e98fbb55c3.tar.gz dotemacs-82ba818ff456bcd6d56a06226e3f27e98fbb55c3.zip | |
removing all downloaded devdocs files
Diffstat (limited to 'devdocs/c/language%2Flifetime.html')
| -rw-r--r-- | devdocs/c/language%2Flifetime.html | 41 |
1 files changed, 0 insertions, 41 deletions
diff --git a/devdocs/c/language%2Flifetime.html b/devdocs/c/language%2Flifetime.html deleted file mode 100644 index b250592e..00000000 --- a/devdocs/c/language%2Flifetime.html +++ /dev/null @@ -1,41 +0,0 @@ - <h1 id="firstHeading" class="firstHeading">Lifetime</h1> <p>Every <a href="object" title="c/language/object">object</a> in C exists, has a constant address, retains its last-stored value (except when the value is indeterminate)<span class="t-rev-inl t-since-c99"><span>, and, for VLA, retains its size</span><span><span class="t-mark-rev t-since-c99">(since C99)</span></span></span> over a portion of program execution known as this object's <i>lifetime</i>.</p> -<p>For the objects that are declared with automatic, static, and thread storage duration, lifetime equals their <a href="storage_duration" title="c/language/storage duration">storage duration</a> (note the difference between non-VLA and VLA automatic storage duration).</p> -<p>For the objects with allocated storage duration, the lifetime begins when the allocation function returns (including the return from <code><a href="../memory/realloc" title="c/memory/realloc">realloc</a></code>) and ends when the <code><a href="../memory/realloc" title="c/memory/realloc">realloc</a></code> or deallocation function is called. Note that since allocated objects have no <a href="object" title="c/language/object">declared type</a>, the type of the lvalue expression first used to access this object becomes its <a href="object" title="c/language/object">effective type</a>.</p> -<p>Accessing an object outside of its lifetime is undefined behavior.</p> -<div class="c source-c"><pre data-language="c">int* foo(void) { - int a = 17; // a has automatic storage duration - return &a; -} // lifetime of a ends -int main(void) { - int* p = foo(); // p points to an object past lifetime ("dangling pointer") - int n = *p; // undefined behavior -}</pre></div> <p>A pointer to an object (or one past the object) whose lifetime ended has indeterminate value.</p> -<h3 id="Temporary_lifetime"> Temporary lifetime</h3> <p>Struct and union objects with array members (either direct or members of nested struct/union members) that are designated by <a href="value_category" title="c/language/value category">non-lvalue expressions</a>, have <i>temporary lifetime</i>. Temporary lifetime begins when the expression that refers to such object is evaluated and ends <span class="t-rev-inl t-until-c11"><span>at the next <a href="eval_order" title="c/language/eval order">sequence point</a></span><span><span class="t-mark-rev t-until-c11">(until C11)</span></span></span><span class="t-rev-inl t-since-c11"><span>when the containing full expression or full declarator ends</span><span><span class="t-mark-rev t-since-c11">(since C11)</span></span></span>.</p> -<p>Any attempt to modify an object with temporary lifetime results in undefined behavior.</p> -<div class="c source-c"><pre data-language="c">struct T { double a[4]; }; -struct T f(void) { return (struct T){3.15}; } -double g1(double* x) { return *x; } -void g2(double* x) { *x = 1.0; } -int main(void) -{ - double d = g1(f().a); // C99: UB access to a[0] in g1 whose lifetime ended - // at the sequence point at the start of g1 - // C11: OK, d is 3.15 - g2(f().a); // C99: UB modification of a[0] whose lifetime ended at the sequence point - // C11: UB attempt to modify a temporary object -}</pre></div> <h3 id="References"> References</h3> <ul> -<li> C17 standard (ISO/IEC 9899:2018): </li> -<ul><li> 6.2.4 Storage durations of objects (p: 30) </li></ul> -<li> C11 standard (ISO/IEC 9899:2011): </li> -<ul><li> 6.2.4 Storage durations of objects (p: 38-39) </li></ul> -<li> C99 standard (ISO/IEC 9899:1999): </li> -<ul><li> 6.2.4 Storage durations of objects (p: 32) </li></ul> -<li> C89/C90 standard (ISO/IEC 9899:1990): </li> -<ul><li> 3.1.2.4 Storage durations of objects </li></ul> -</ul> <h3 id="See_also"> See also</h3> <table class="t-dsc-begin"> <tr class="t-dsc"> <td colspan="2"> <span><a href="https://en.cppreference.com/w/cpp/language/lifetime" title="cpp/language/lifetime">C++ documentation</a></span> for <span class=""><span>Object lifetime</span></span> </td> -</tr> </table> <div class="_attribution"> - <p class="_attribution-p"> - © cppreference.com<br>Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.<br> - <a href="https://en.cppreference.com/w/c/language/lifetime" class="_attribution-link">https://en.cppreference.com/w/c/language/lifetime</a> - </p> -</div> |
