Необходимо различать область действия и время жизни переменной.
Простыми словами:
«область действия» означает регион вашего исходного кода , где переменная известна компилятору . Если переменная (по правилам) не видна компилятору, он откажется компилировать обращения к ней.
«время жизни» означает время, начинающееся с выделения памяти для переменной до момента, когда память присваивается другой переменной или освобождается. Переменная static
живет до тех пор, пока работает программа. Переменная, не являющаяся static
, живет так же долго, как и ее область действия.
Однако, только потому, что область действия и время жизни переменной «завершены», это не означает, что память исчезает. Физические клетки все еще там, и они хранят свое последнее содержимое. Вот почему вы можете программировать функции, которые возвращают указатель на некоторую локальную переменную, и извлекать содержимое этих переменных после того, как и область действия, и время жизни переменной пропали. Это прекрасный пример запутанной проблемы новичка.
Рассмотрим компилятор для встроенного процессора, подобного 8051. Конечно, довольно старая и простая машина, но хороший пример. Этот компилятор обычно помещает локальные переменные в свой сегмент данных. Но чтобы использовать ограниченное пространство памяти (всего 128 байт, включая рабочие регистры и стек), те же самые области памяти повторно используются для переменных с непересекающимися временами жизни. Несмотря на то, что вы можете получить доступ к любой памяти из всех программ.
Теперь, юристы по языкам, начните задавать мне. ; -)