Stack overflow c++ (где моя память?)

152
28 апреля 2019, 20:20

Пишу программу для реверса символов в предложении (с помощью рекурсивной функции, обязательно). При первом же входе в функцию VS начинает орать о перегрузке стека. Увеличил объем с 1мб до 4х для этого проекта - не помогает.

Вызвано исключение по адресу 0x011E5B89 в Project1.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x01202FD4). Необработанное исключение по адресу 0x011E5B89 в Project1.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x01202FD4).

#include <iostream>
#include <cstdlib>
#include <Windows.h>

using namespace std;
int textreverse(int fi, char rtext[10]);
int main()
{
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
int strln, i, si;
char refstring[10], resstring[10];
cout << "Введите предложение до 100 символов, где последний символ - точка:" << endl;
cin >> refstring;
strln = 0;
for (i = 0; i <= 10; i++) {
    if (refstring[i] == '.') {
        strln = i + 1;
        break;
    }
}
if (strln != 0) {
    if (refstring[0] != '.') {
        textreverse(0, refstring);
    }
    else {
        cout << "Ошибка! Первый символ стоки - точка!" << endl;
    }
}
else {
    cout << "Ошибка! В строке нет точки!" << endl;
}
system("pause"); 
return 0;
}
int textreverse(int fi, char rtext[10])
{
if (rtext[fi] != '.') {
    textreverse(fi++, rtext);
}
else {
    cout << rtext[fi];
}
cout << endl;
return 0;
}
Answer 1

Дело не только в стеке. Смотрите:

char refstring[10], resstring[10];
cout << "Введите предложение до 100 символов, где последний символ - точка:" << endl;
cin >> refstring;

В refstring у вас вносится одно слово, до пробела, а не строка, причем вы запрашиваете до 100 символов, а вносите в массив из 10 байт, так что слово в 10 символов уже вызовет проблемы.

Дальше у вас некорректно считается strln - если точки нет (а ее скорее всего нет), это нуль.

Да и сама функция обращения строки вызывает сомнения в ее адекватности (хотя внимательно я ее не смотрел).

Я бы делал так:

void reverse(char * text, int first, int last)
{
    if (first >= last) return;
    char tmp = text[first];
    text[first] = text[last];
    text[last] = tmp;
    reverse(text,first+1,last-1);
}

У вас в функции идет рекурсивный вызов

textreverse(fi++, rtext);

т.е. вы вызываете ее с тем же значением 0, что и остальные вызовы - ведь ++ у вас постфиксный! Вызывайте как

textreverse(fi+1, rtext);

Правда, и при этом работать она не станет, но бесконечной рекурсии не будет...

Но все указанные вначале ошибки исправьте тоже :)

READ ALSO
нагрузка на CPU из-за потоков в dll c++

нагрузка на CPU из-за потоков в dll c++

есть такого типа код:

136
Как использовать glm::ortho?

Как использовать glm::ortho?

Хочу получить результат, как, например, в Blender, в ортогональном режиме

145
Не создаются значения в реестре

Не создаются значения в реестре

У меня есть два QSettings в разных файлах, у одного все значения передаются в реестр, а другого - нет

170
Организация MVC в c++

Организация MVC в c++

Пытаюсь использовать паттерн MVCКак лучше организовать хранение модели и представления в контроллере? Вижу 2 варианта:

145