Нет Stackoverflow: автоматический объект внутри цикла while - PullRequest
1 голос
/ 20 августа 2010

Я просматривал чей-то код, где натолкнулся на поток:

while(TRUE)

{
 ......
 STRUCT_MSG_SYS_HEADER  sysHdr;
 .....
 ....
}

Существует пять таких потоков, я хочу сказать, что "STRUCT_MSG_SYS_HEADER sysHdr;"приведет к переполнению стека через некоторое время или дни ... (не проверено, хотя).Поэтому я решил написать простой пример приложения

  1 #include "stdio.h"
  2
  3 struct infinite
  4 {
  5     int arr[1000000];
  6 }infinite;
  7
  8 int main()
  9 {
 10     while(1)
 11     {
 12         struct infinite infobj;
 13         printf("\ninfinite = %x\n", &infobj);
 14     }
 15     return 0;
 16 }

Но здесь он печатает тот же адрес для infobj.Мое мнение о stackoverflow неверно или здесь компилятор провел некоторую оптимизацию?(Я считаю себя хорошим программистом, но подобные вещи заставляют меня снова подумать, снова прочитать Дениса Ричи)

Ответы [ 2 ]

5 голосов
/ 20 августа 2010

infobj уничтожается в конце каждой итерации цикла while, поэтому стек не переполняется, и вы получаете один и тот же адрес снова и снова.Можно ли выделить int arr[1000000] в стеке, зависит от максимально допустимого размера стека на поток.В компиляторе VC это 1 МБ, но его можно изменить с помощью параметров компилятора.

4 голосов
/ 20 августа 2010

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

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

...