Объявление переменной в цикле for - PullRequest
2 голосов
/ 20 сентября 2011

Я пробовал следующий код C:

void main()
{
   int i;
   for(i = 0; i< 10; i++)
   { 
      int num;
      printf("\nthe variable address is: %p", &num);

   }
   getch();
}

Я ожидал, что он либо выдаст ошибку, либо объявит num несколько раз, но вместо этого выходные данные показывают одинаковое значение для &num для всех итераций цикла for. В чем причина такого поведения? Кажется, что независимо от наличия объявления в цикле for, фактическое объявление / определение происходит только один раз.

Может ли кто-нибудь помочь мне понять это поведение?

Ответы [ 2 ]

7 голосов
/ 20 сентября 2011

Вы печатаете адрес переменной, размещенной в стеке.Область действия переменной - цикл for.Теоретически переменная создается в строке int num;, а ее память освобождается при закрытии для скобок.Расположение памяти строго зависит от компилятора.

Возможно, ваш компилятор достаточно умен, чтобы знать, что может повторно использовать эту память, или может быть, что память свободна и выбрана компилятором для хранения переменных.

Можеттакже может быть, что оптимизатор говорит компилятору, что можно использовать повторно num.

Однако все зависит от компилятора, только потому, что он имеет один и тот же адрес, не означает, что он объявлен / определен только один раз.

3 голосов
/ 20 сентября 2011

Чтобы проиллюстрировать это, сравните это:

   int i;
   int val = 0;
   for(i = 0; i< 5; i++)
   { 
      int num = val++;
      printf("\nthe variable address is: %p", &num);
      printf("\nthe value is: %d", num);
   }

Это снова показывает, что num всегда имеет один и тот же адрес, но также инициализируется с различным значением на каждой итерации.

Идея со стеком состоит в том, что его расположение определяется во время компиляции;каждая переменная стека отображается на адрес в стеке с кадром стека.

Еще одна вещь, которую вы должны получить, это учесть, что если каждая итерация «выделяет» новую переменную, как маленькая машина будет обрабатывать большой цикл?

См .: Call Stack

...