Переполнение стека в Visual Studio при определении переменных (c ++) - PullRequest
0 голосов
/ 24 ноября 2018

Я пытался решить проблему конкуренции в стиле ссылки ниже, используя c ++ (реальная проблема, которую я пытаюсь решить, недоступна для общественности)

http://orac.amt.edu.au/cgi-bin/train/problem.pl?set=aio18int&problemid=1032

Я написал программу на C ++ в Visual Studio, которая пытается решить ее, но когда я запускаю этот код: (есть некоторые включения для, но я не смог получить форматирование).

    int main() 
{
int n = 1;

freopen("pairin.txt", "r", stdin);


scanf("%d", &n);

int s[200005];
for (int i = 0; i < 2 * n; i++)
{
    scanf("%d", &s[i]);
}

int d[100005];
for (int i = 0; i < n; i++) {
    d[i] = -1;
}

for (int i = 0; i < n; i++) {
    if (d[s[i] - 1] == -1) {
        d[i] == s[i];
    }
    else {
        d[i] = i - d[i];
    }
}

int max = 0;
for (int i = 0; i < n; i++) {
    if (d[i] > max) {
        max = d[i];
    }
}

freopen("pairout.txt", "w", stdout);
printf("%d", max);

return 0;
}

Возвращает ошибку: необработанное исключение в 0x00B11CC9 в a.exe: 0xC00000FD: переполнение стека (параметры: 0x00000000, 0x00402000).Произошло

Затем Visual Studio по какой-то причине открывает вкладку в asm-файле chkstk.asm.

У меня есть представление о том, когда эта ошибка возникает нормально, но что, по-видимому, ее вызываетопределял "int n = 1;"когда я вошел с отладчиком, который абсолютно поражает мой разум.Все, что я хочу сделать, это отладить мой алгоритм, не пытаясь получить int n = 1;на работу.

Я использую Visual Studio 2017, с включенным флагом _CRT_SECURE_NO_WARNINGS.

Я пытался это сделать в онлайн-среде IDE (закомментировав все строки ввода-вывода), и main () вернул 0просто отлично.

1 Ответ

0 голосов
/ 24 ноября 2018

Причина проблемы в определениях массивов s и d.Эти переменные расположены в стеке.Занятое пространство больше 1 МБ, но размер стека по умолчанию в Visual Studio составляет 1 МБ :

/ F Устанавливает размер стека программы в байтах.Без этой опции размер стека по умолчанию равен 1 МБ.

Таким образом, вам не хватает места в стеке.

Чтобы решить эту проблему, вы должны увеличить размер стека или выделить память в куче или уменьшить размер массива (например, int s[100000]; и int d[50000];).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...