Почему так?
bool arr[256][4096];
arr[20][100] = true;
cout << arr[20][101]; // Stack overflow
VS2015, тест на онлайн компиляторах ошибку не выявляет :(
Если хочешь именно матрицу bool-ов фиксированных размеров:
#include <memory>
...
typedef bool t_arr[256][4096];
std::unique_ptr<t_arr> p_arr(new t_arr);
(*p_arr)[20][100] = true;
t_arr& arr=*p_arr; // эту ссылку используем, если лениво каждый раз разыменовывать указатель.
arr[20][100] = true;
cout << arr[20][101];
для современных компиляторов можно лаконичнее:
auto p_arr=std::make_unique< bool[256][4096] >();
auto& arr=*p_arr;
arr[20][100] = true;
cout << arr[20][101];
Другой путь ("Более С++-й"), стандартные контейнеры:
#include <vector>
...
std::vector< std::vector< bool > > arr( 256, std::vector< bool >( 4096 ) );
arr[20][100] = true;
cout << arr[20][101];
Недостаток второго подхода - нет сплошного поля памяти (будет сделано несколько 257 аллокаций, вместо одной, и код получится менее дружественный к кешу процессора). Достоинство: будет использовано меньше памяти (за счет специализированного std::vector< bool >, как массива битовых флагов, а не bool-ов).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей