Если есть явный недостаток, извините. Я довольно плохо знаком с памятью, поэтому у меня есть некоторое представление о том, как работает переполнение стека, и, насколько я знаю, все, что я делаю, не должно вызывать переполнение стека. Все, что я делаю, это меняю символ в строке.
Я знаю, что массивы являются указателями, но может ли изменение значения вызвать переполнение стека?
Вот соответствующая функция:
char base[] = "aaaaa";
void changeLetters(int position) { // Stack overflow happens around here
if (base[position] != 'z') {
base[position]++;
}
// When I include a cout here, I also get a stack overflow
if (position == 4 && base[position] != 'z') {
changeLetters(position);
}
else if (base[position] == 'z' && position != 0) {
base[position] = 'a';
changeLetters(position - 1);
}
else if (position < 4) {
changeLetters(position + 1);
}
}
Если у меня нет std::cout
, я получаю
Необработанное исключение в 0x767C3210 (KernelBase.dll) в passwordCracker.exe: 0xC00000FD: переполнение стека (параметры: 0x00000001, 0x01002FFC).
В противном случае
Необработанное исключение в 0x009C38B9 в passwordCracker.exe: 0xC00000FD: переполнение стека (параметры: 0x00000001, 0x006D2F8C).
Edit:
Функция вызывается в основном цикле. Переданное значение - это длина строки (4), и она проходит через нее. Одна странная вещь, которую я не упомянул, это то, что она отлично работает, если я перебираю меньшее количество букв (a, b, c, d), но я получаю переполнение стека, только если у меня есть цикл по алфавиту.