#c
#c
Вопрос:
В моем коде происходит переполнение стека, я действительно не знаю, что его вызывает. Родительский элемент — это фиксированный массив, подобный 14.
protected:
int* parent = new int[14];
int size = 14;
int Tree::level(int i) {
int count = 0;
for (int j = 0; j < size; j ) {
if (parent[i] == -1) {
count = 1;
} else {
count = level(i) 1; //this is causing the stack Overlow
}
}
return count;
}
Комментарии:
1. если
parent[i]
естьunsigned
, это может быть плохо. Для уверенности попробуйте поставить точку останова вcount = 1
условии. Это тоже было бы неплохо знатьsize
… Пожалуйста, добавьте исполняемый пример и убедитесь, что у вас нет предупреждений при компиляции.2.
14
это не массив, так что вы имели в виду? В любом случае, почему вы вообще используете рекурсию там?3. Пожалуйста, опубликуйте определение и данные родительского массива. Кроме того, я полагаю, вы имеете в виду
level(i 1)
?4. Не могли бы вы, пожалуйста, предоставить нам больше информации об ошибке? Вы пробовали отладку, чтобы узнать, в каком состоянии была ваша программа на момент сбоя? Можем ли мы увидеть
parent
массив? Значениеsize
? Afaik, создание экземпляра 2int
s приведет к переполнению вашего стека слишком большим количеством рекурсии.5. @J.R.
i
никогда не меняется, поэтому он должен вызывать одно и то же навсегда
Ответ №1:
Рекурсивный вызов в следующем вызове обязательно вызовет бесконечную рекурсию, поскольку i
не изменяется в функции.
count = level(i) 1;
Я предполагаю, что вы имели в виду использовать j
or parent[i]
вместо i
в этом вызове. Трудно сказать, какое значение правильно использовать в рекурсивном вызове без дополнительного контекста.
Комментарии:
1. Не нашел
j
, вы имели в видуparent[i]
?2. @Deduplicator,
j
является переменной цикла. Однако вы приводите еще один обоснованный аргумент. Это может бытьparent[i]
.
Ответ №2:
В случае выполнения условия parent[i] == -1
false функция «level» становится бесконечно рекурсивной и, следовательно, переполняет стек.