Является ли стековый кадр функции, вызываемой несколько раз, каждый раз различным?

void foo()
{
    int i;
    printf("%d",i++);
}

int main()
{
    int j;
    for(j=0;j<10;j++)
    {
        foo();
    }
}

Результатом кода является серия из 10 случайных, но непрерывных чисел. Я хотел знать, как это возможно, если я инициализируюсь каждый раз и мой класс хранения также автоматический?
Также назначается ли кадр стека для foo() снова каждый раз, когда он вызывается, или это тот же самый?

1 ответ

autoпеременные автоматически не инициализируются, они содержат мусор. Эти переменные обычно выделяются в стеке с помощью операции быстрого стека. В foo() у вас есть такая переменная, поэтому printf выводит случайные данные.

Даже если функция foo() была вызвана рекурсивно, проблема с автопеременными остается, каждый вызов создает новый stack frame содержащие мусор.

Так,

Является ли стековый кадр функции, вызываемой несколько раз, каждый раз различным?

ДА. Если вы не используетеstaticпеременные в этой функции. Но тогда у вас будут переменные, которые сохраняют свое значение, но которые на самом деле всегда одни и те же (больше никаких "локальных" или, лучше сказать, глобальных, но видимых только в этой функции (области видимости)).

======== РЕДАКТИРОВАТЬ после комментария ========
Что ж, приведенное выше предложение содержит формальную ошибку. Неверно, что кадр стека будет другим: он может быть одинаковым между вызовами (вероятно, нет, если используется рекурсия). Но вы не можете быть уверены, что это одно и то же, поэтому вы должны предполагать, что каждый раз он отличается. Предполагая, что это другое, вы утверждаете, что это другое, даже если это не так. Если вы не хотите использовать какой-то загадочный алгоритм...

Другие вопросы по тегам