Код, который у вас есть, может привести к ошибке в моем опыте.Без обратной связи от компилятора или программы немного трудно определить, что именно пошло не так, но я полагаю, что вы, возможно, ищете (как правило) информацию о стеках, кучах и рекурсии.
Во-первых, обратите внимание, что
void rec1 () {
k++;
if (k % MOD == 0)
fprintf (stderr, "%d ", k / MOD);
rec1 ();
}
- это НЕ"Итерация". Итерация относится к повторению последовательной части кода (обычно цикл for
или while
).Здесь у вас есть рекурсия . Рекурсия создает новый экземпляр метода для работы вместе с указателем стека для перехода к последней точке выполнения (а также для хранения любых непосредственно релевантных переменных).Это происходит каждый раз, когда вы вызываете функцию rec1 ()
из функции rec1 ()
В конце концов, вам не хватит места в стеке для хранения этих указателей.Количество указателей, которые вы можете хранить в стеке, обычно достаточно велико на современных компьютерах, но, учитывая, что у вас нет оператора return
, вы в конечном итоге получите максимальную емкость.
РЕДАКТИРОВАТЬ
Это сообщение было отредактировано, чтобы отразить новый материал, представленный вопросом.
Хорошо ... Из материала, который вы представили,похоже, что вас по существу спрашивают, ГДЕ каждый rec
хранит и обрабатывает информацию ...
В случае Rec1
это действительно простой случай переполнения стека.Указатель на последнюю точку выполнения предыдущего Rec1 сохраняется в стеке, что в конечном итоге приводит к падению программы после примерно 520 000 экземпляров.Учитывая, что каждый указатель составляет 4 байта, это примерно 2 МБ только одной информации рекурсивного указателя, хранящейся в вашем стеке до того, как он разрушится и вызовет сбой сегмента из-за переполнения стека.
Второй случай немного сложнее.Обратите внимание, что ваша программа указывает, что она делает примерно 260 000 рекурсий, прежде чем вызовет сбой сегмента.Это ровно половина Rec1. ОДНАКО , это не обязательно переполнение стека как таковое.Rec2 выделяет 400 байтов данных в куче за рекурсию.Указатель на кучу хранится в стеке, это означает, что в рекурсии в стеке хранится 8 байтов (что может быть связано с тем, почему именно его половина, но также может быть объяснено отношением вашего стекаразмер кучи).Теперь ошибка для Rec2 гласит, что malloc
не может найти файл или каталог, что мне кажется, что malloc не может завершиться правильно.Это может фактически указывать на то, что максимальный размер кучи был достигнут.
Rec3
довольно просто.Весь целочисленный массив tmp хранится в стеке для каждой рекурсии.это 4 байта на целое число, умноженное на 100, что составляет 400 байтов в рекурсии стека.Неудивительно, что происходит сбой от 10 000 до 20 000 рекурсий.Просто не хватило места для хранения данных в стеке. ПРИМЕЧАНИЕ : В связи с тем, что вы упомянули в своем вопросе, этот массив tmp не пытается выделить ту же область памяти.Из-за того, что это рекурсивно, это создает новое пространство в стеке для этого экземпляра функции.
Rec4
- простой случай переполнения буфера.После перезаписи первых 100 байтов памяти, выделенной в global[100],
, было только вопросом времени, когда k++
заставит global[k]
указать на адресное пространство, ограниченное процессом.Это вызвало ошибку сегмента после примерно 4000 рекурсий (k не было модом 10 000 в rec4
).
Надеюсь, это разъяснение поможет.