Исключение переполнения стека, возникающее при вызове метода

Я работаю над проблемой в C ++, но получаю исключение переполнения стека, и я не могу сказать, почему. Основной метод вызывает problem28 (), но первая строка должна вывести «check» в мой вывод, чего не происходит. Если я определяю размер сетки как 501 или меньше, он работает нормально, но что-то еще, и это вызывает исключение переполнения стека.

Любая помощь будет оценена.

#define right 0
#define down 1
#define left 2
#define up 3
#define gridsize 1001

int* next(int row, int col, int dir) {
int* newPos = new int[2];
newPos[0] = row;
newPos[1] = col;
switch(dir) {
case right:
newPos[1] += 1;
break;
case down:
newPos[0] += 1;
break;
case left:
newPos[1] -= 1;
break;
case up:
newPos[0] -= 1;
break;
}
return newPos;
}

int problem28() {
cout << "check" << endl;
int grid[gridsize][gridsize];
for (int i = 0; i < gridsize; i++)
for (int j = 0; j < gridsize; j++)
grid[i][j] = 0;
int* pos = new int[2];
pos[0] = pos[1] = gridsize / 2;
int dir = right;for (int i = 1; i <= 1001; i++) {
grid[pos[0]][pos[1]] = i;
pos = next(pos[0], pos[1], dir);
int* npos;

npos = next(pos[0], pos[1], (dir + 1) % 4);
if (grid[npos[0]][npos[1]] == 0)
dir = (dir + 1) % 4;
}
cout << "generated grid" << endl;

int total = 0;
for (int i = 0; i < gridsize; i++) {
total += grid[i][i];
total += grid[i][gridsize - i - 1];
}
total -= grid[gridsize / 2][gridsize / 2];

return 0;
}

int main() {
problem28();

system("pause");
return EXIT_SUCCESS;
}

1

Решение

Ваш стек обычно довольно ограничен по сравнению с общей памятью. поскольку problem28 не кажется рекурсивным, безусловно, самое простое исправление, которое, скорее всего, сработает, это изменить:

int grid[gridsize][gridsize];

чтобы:

static int grid[gridsize][gridsize];

Это будет выделять память для этого массива статически, а не локально, что обычно будет означать, что его больше нет в стеке.

Другой возможностью было бы использовать std::vector вместо массива. Обычно он будет выделять свою память из свободного хранилища, а не локально. Незначительная проблема в том, что vector (само по себе) не обеспечивает 2D-адресацию, поэтому вам придется обрабатывать это отдельно (например, используя array_2D Я написал в предыдущем ответе).

3

Другие решения

Если я определяю размер сетки как 501 или меньше, он работает нормально, но что-то еще, и это вызывает исключение переполнения стека.

Целиком grid Массив живет в стеке. Если int имеет ширину 32 бита, int[500][500] занимает ~ 1 МБ, что является максимальным размером стека по умолчанию в некоторых операционных системах.

Вы можете либо увеличить размер стека, либо (желательно) выделить grid в кучу.

1

Проблема, кажется, здесь:

int grid[gridsize][gridsize];

Вы пытались выделить этот 2D массив динамически?

0

Я рекомендую вам использовать такую ​​программу, как Application Verifier, чтобы найти проблему, вызывающую сбой:

Загрузка верификатора приложения

Важно, чтобы вы научились отлаживать свое программное обеспечение и понимать, что происходит. Пожалуйста, запустите ваш код в отладчике (Visual Studio, Eclipse) и посмотрите, где он останавливается. Если вы использовали Application Verifier, то он, скорее всего, остановится там, где возникла проблема. Посмотрите на переменные и посмотрите, имеют ли они смысл. Посмотрите, есть ли у вас доступ к ячейкам памяти, которые вы не должны.

Чтобы использовать Application Verifier с Visual Studio, установите его, затем найдите appVerifier.exe в папке System32 в C: \ Windows. Затем откройте файл и укажите его на свой исполняемый файл. Включите то, что вы считаете правильными проверками. Затем запустите его в Visual Studio.

Для Linux вы можете (и должны) использовать valgrind для выявления подобных проблем

0
По вопросам рекламы [email protected]