Это оптимизация компилятора.Поскольку локальная переменная выходит из области видимости, а переменная того же типа собирается создаваться, она повторно использует адрес памяти.Важно отметить, что это все еще «новая» или «новая» переменная в том, что касается вашей программы.
Сравните следующие фрагменты кода и выходные данные:
for (i = 0; i < 3; i++) {
int n = 0;
printf("%p %d\n", (void *)&n, n++);
}
0x7fff56108568 0
0x7fff56108568 0
0x7fff56108568 0
for (i = 0; i < 3; i++) {
static int n = 0;
printf("%p %d\n", (void *)&n, n++);
}
0x6008f8 0
0x6008f8 1
0x6008f8 2