Является ли доступ к статическому невнимательному поведению undefined?
Говоря с моим коллегой, они сказали, что:
foo() {
int *p;
{
int x = 5;
p = &x;
}
int y = *p;
}
создает поведение undefined, поскольку правила жизни и правила области действия не указывать.
Однако:
foo() {
int *p;
{
static int x = 5;
p = &x;
}
int y = *p;
}
не undefined! Вы получаете проблемы с косвенным определением.
Использование терминологии не является правильным.
Я знаю, что статика не имеет никакого отношения к определению области.
Верно ли, что второй случай определил поведение?
Ответы
Ответ 1
Да, второй случай имеет четко определенное поведение. A static
переменная - это, в основном, глобальная переменная, имя которой ограничено областью, в которой она объявлена. Она инициализируется при первом вводе области действия, а затем она живет для жизни программы.
Итак, когда мы достигаем
int y = *p;
p
указывает на переменную, которую вы больше не можете достичь (не можете вернуться к этому коду), но все же имеет допустимый срок службы.
Чтобы процитировать стандартный [basic.stc.static]
Все переменные, которые не имеют динамической продолжительности хранения, не имеют продолжительности хранения потоков и не являются локальными, имеют статическую продолжительность хранения. Хранилище для этих объектов должно длиться в течение всего времени программы
акцент мой
Первый случай undefined, поскольку время жизни локальной области x
заканчивается на }
и пытается ссылаться на него после того, как его конец жизни будет undefined.
Ответ 2
цитирование из
здесь
Статический класс хранения указывает компилятору сохранить локальную переменную в течение жизненного цикла программы, а не создавать и уничтожать ее каждый раз, когда она входит и выходит за рамки. Поэтому статические локальные переменные позволяют им поддерживать свои значения между вызовами функций.
так что да во втором случае x
существует в течение всего жизненного цикла программы.
следовательно, определено поведение.