Вылезает ошибка, пишу на С++

Вылазит ошибка: Необработанное исключение по адресу 0x003CDA99 в 10.4.exe: 0xC00000FD: Stack overflow (параметры: 0x00000000, 0x001C2000). Не понимаю как ее решить вот код:

#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;

const int N = 2000, M = 2000;
const char* NOTFILE_IN = "Файл IN не найден.";
const char* NOTFILE_OUT = "Файл OUT не найден.";
typedef int matrix[N][M];

int main()
{
    setlocale(LC_ALL, "RUSSIAN");

    ifstream in("input.txt");
    ofstream out("output.txt");
    int n, m, r;
    in >> n >> m >> r;
    int matrix[N][M];

    out << n << ' ' << m << ' ' << r << endl;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            in >> matrix[i][j];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            out << matrix[i][j] << "\t";
        }
        out << endl;
    }

    in.close();
    out.close();

    return 0;
}

Ответы (2 шт):

Автор решения: Arenoros

По умолчанию максимальный размер стека для Win32 = 1Мб, вы же пытаетесь выделить память в ~16mb (2000*2000*4)

int matrix[N][M];
→ Ссылка
Автор решения: magewizardmen

Проблема в том, что вы пытаетесь выделить память на стеке больше, чем размер самого стека. По умолчанию размер стека 1 МБ. Для изменения размера стека, если вы используете Visual Studio, используйте #pragma comment(linker, "/STACK:размер_стека_в_байтах").

Но лучше просто выделите память под массив из кучи:

int** matrix = new int*[N];
for(int i = 0; i<N; i++)
    matrix[i] = new int[M];

После завершения работы с матрицей не забудьте освободить выделенную под неё память:

for(int i = 0; i<N; i++)
    delete[] matrix[i];
delete[] matrix;
→ Ссылка