Подтвердить что ты не робот

Является ли доступ к статическому невнимательному поведению 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! Вы получаете проблемы с косвенным определением.

Использование терминологии не является правильным.
Я знаю, что статика не имеет никакого отношения к определению области. Верно ли, что второй случай определил поведение?

4b9b3361

Ответ 1

Да, второй случай имеет четко определенное поведение. A static переменная - это, в основном, глобальная переменная, имя которой ограничено областью, в которой она объявлена. Она инициализируется при первом вводе области действия, а затем она живет для жизни программы.

Итак, когда мы достигаем

int y = *p;

p указывает на переменную, которую вы больше не можете достичь (не можете вернуться к этому коду), но все же имеет допустимый срок службы.

Чтобы процитировать стандартный [basic.stc.static]

Все переменные, которые не имеют динамической продолжительности хранения, не имеют продолжительности хранения потоков и не являются локальными, имеют статическую продолжительность хранения. Хранилище для этих объектов должно длиться в течение всего времени программы

акцент мой

Первый случай undefined, поскольку время жизни локальной области x заканчивается на } и пытается ссылаться на него после того, как его конец жизни будет undefined.

Ответ 2

цитирование из здесь

Статический класс хранения указывает компилятору сохранить локальную переменную в течение жизненного цикла программы, а не создавать и уничтожать ее каждый раз, когда она входит и выходит за рамки. Поэтому статические локальные переменные позволяют им поддерживать свои значения между вызовами функций.

так что да во втором случае x существует в течение всего жизненного цикла программы.

следовательно, определено поведение.