Нет ограничений по глубине рекурсии в самом стандарте C.Вы можете вызвать переполнение стека, но размер стека отличается в разных средах.Я думаю, что Windows имеет 1 МБ, а Linux 8 МБ.Это также зависит от размера стекового фрейма для функции, который, в свою очередь, зависит от количества переменных и типа.
В вашем случае у вас есть две long
переменные, которые, вероятно, составляют 8 байт.каждый.У вас также есть строка "%ld\t"
размером 5 байт, которая может оказаться в стеке, но я не уверен.Вдобавок к этому у вас есть служебные данные двух указателей на адрес возврата функции и на предыдущий кадр стека, и они являются 8 байтами каждый в 64-битной системе.Таким образом, кадр стека для вашей функции будет примерно 32 байта или около того.Может быть, немного больше.Поэтому в системе Linux я бы предположил, что ваша функция зависнет на глубине около 200 000
Если это проблема, рассмотрите возможность переписать функцию в нерекурсивный вариант.Посмотрите на ответ Blaze, чтобы узнать, как это можно сделать для вашего случая.И как прокомментировал andreee ниже:
Дополнительное примечание: Вы можете увеличить размер стека в Linux с помощью ulimit -s (также возможно: ulimit -s unlimited), а в MSVC вы можете установить флаг компиляции / Fувеличить размер стека вашей программы.Для MinGW см. этот пост.