Основной рекурсивно вызывается без локальных переменных - PullRequest
0 голосов
/ 18 марта 2019

Что выводится из следующего:

int main() 
{
    printf ("welcome");    
    main ();    
    return;    
}    

Опции:

  1. Main вызывается бесконечное время
  2. main вызывается 65535 раз.
  3. main вызывается 32765 раз.
  4. Переполнение стека.
  5. Ошибка компиляции.

Мой анализ: я думаю, что Вариант 1. правильный.Вариантов 2,3 и 5 точно нет.я не думаю, что для варианта 4.Я полагаю, что переполнение стека могло бы произойти, если бы основная функция использовала некоторые локальные переменные, занимающие память.Итак, я считаю вариант 1 правильным!Я согласен, что рекурсивная функция вызывает переполнение стека, но это также зависит от того, что реализует функция.В этом случае печатается только printf.Пожалуйста, дайте мне знать ваше мнение об этом.Спасибо!

Ответы [ 4 ]

2 голосов
/ 18 марта 2019

Это явно compilation error, так как функция возвращает целое число, а ваш возврат ничего не возвращает.

int несовместимо с void.

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

2 голосов
/ 18 марта 2019

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

В большинстве реализаций я бы ожидал # 4.Даже если у вас нет локальных переменных, ему все равно нужен стек стека для хранения местоположения возврата.

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

return main();
0 голосов
/ 18 марта 2019

В вашем случае это будет первая ошибка компиляции, так как функция возвращаемого типа int не возвращает никакого значения.

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

Таким образом, после каждого стека вызовов будет адрес возврата оператора.

0 голосов
/ 18 марта 2019

Не обращая внимания на момент, что рекурсивный вызов main не является хорошей идеей, вы получите переполнение стека, если запустите этот код.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...