unsigned short data_table[3][5000000];
Это получается грубо 3 х 5 Мбайт = 15 Мбайт
Спорю, что тут еще "х 2". Итого - 30 МБ.
Еще точнее - 28.6 МБ. Ведь память меряют не десятичным аршином, а двоичным!
Как уже сказано, большие блоки в стеке не создают, а тем более для резерва - динамически освободить ты его не сможешь. См. new/delete. И нафига эта морока с двумерностью и short?
void *ptrReservedMemory;
ptrReservedMemory = new char[30 * 1024 * 1024];
delete[] ptrReservedMemory;
Кстати, Вить, например в Perl есть механизм резервирования памяти —
$^M.