TL; DR - переменная со статическим хранилищем живет в течение всего выполнения программы, и любой доступ к ней будет действительным.Доступ к нему возможен из любой части или нет, зависит от scope определения.
Итак, чтобы ответить на заголовок: я согласен, этовводит в заблуждение, но в то же время я добавлю немного больше контекста для уточнения фактического сообщения, которое пытались передать.
У вас уже был свой ответ, просто чтобы добавить мои два цента (используя авторитетные слова из стандарта):
static
- спецификатор класса хранения, он помогает определить продолжительность хранения.
Цитирование C11
, глава §6.2.4
Объект имеет срок хранения , который определяет его время жизни .[....]
Тогда
время жизни объекта - это часть выполнения программы, в течение которой хранение гарантированно будетзарезервировано для этого.Объект существует, имеет постоянный адрес 33) и сохраняет свое последнее сохраненное значение в течение всего срока его службы.[...]
Итак, для переменных с статическая продолжительность хранения ,
Объект, идентификатор которого объявлен без спецификатора класса хранения_Thread_local
, либо с внешней или внутренней связью, либо со спецификатором класса хранения static
, имеет статическую продолжительность хранения.Его время жизни - это полное выполнение программы, и его сохраненное значение инициализируется только один раз, до запуска программы.
'пустой разговор, покажите мне код:
Итак, для сравнения давайте посмотрим фрагменты кода:
- Фрагмент один: Неверный код
#include<stdio.h>
char *func()
{
char arr [ ] = "Hello!";
return arr;
}
int main()
{
printf("%s ", func()); // you're accessing `arr`, some or other way!!
return 0;
}
Здесь возвращаемый указатель указывает на недопустимую память, как и в конце вызова функции, автоматическая локальная переменная arr
уничтожается (время жизни истекло), а возвращенный адрес указывает на недопустимую память.
Таким образом, даже если у вас есть способ доступа к arr
, этот доступ больше недействителен.
- Фрагмент 2: действительный код
#include<stdio.h>
char *func()
{
static char arr [ ] = "Hello!";
return arr;
}
int main()
{
printf("%s ", func()); // you're accessing `arr`, some or other way!!
return 0;
}
это совершенно корректный код, поскольку он делает arr
«доступным» вне области его определения из-за статической длительности хранения .