“Lifetime” is the period during execution of a program in which a variable or function exists. The storage duration of the identifier determines its lifetime.
An identifier declared with the storage-class-specifier static has static storage duration. Identifiers with static storage duration (also called “global”) have storage and a defined value for the duration of a program. Storage is reserved and the identifier’s stored value is initialized only once, before program startup. An identifier declared with external or internal linkage also has static storage duration (see Linkage).
An identifier declared without the static storage-class specifier has automatic storage duration if it is declared inside a function. An identifier with automatic storage duration (a “local identifier”) has storage and a defined value only within the block where the identifier is defined or declared. An automatic identifier is allocated new storage each time the program enters that block, and it loses its storage (and its value) when the program exits the block. Identifiers declared in a function with no linkage also have automatic storage duration.
The following rules specify whether an identifier has global (static) or local (automatic) lifetime:
Although an identifier with a global lifetime exists throughout the execution of the source program (for example, an externally declared variable or a local variable declared with the static keyword), it may not be visible in all parts of the program. See Scope and Visibility for information about visibility, and see Storage Classes in Chapter 3 for a discussion of the storage-class-specifier nonterminal.
Memory can be allocated as needed (dynamic) if created through the use of special library routines such as malloc. Since dynamic memory allocation uses library routines, it is not considered part of the language. See the malloc function in the Run-Time Library Reference.