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