В 32-битной ОС Windows каждый процесс получает 4 ГБ виртуального адресного пространства, из которых 2 ГБ доступно для пользователя, а 2 ГБ - для ядра. Таким образом, все выделенные ресурсы должны быть в пределах 2 ГБ. Обратите внимание, что эти 2 ГБ содержат другие вещи, такие как другие библиотеки, которые загружаются вашим приложением, поэтому эта память фрагментирована. Когда вы выполняете malloc (), так как malloc гарантирует, что он возвращает непрерывный блок памяти, CRT попытается найти 1 ГБ непрерывной свободной памяти, которая может быть недоступна, поэтому malloc () завершается ошибкой. Одним из способов решения этой проблемы было бы использование файлов, отображаемых в память, и отображение только части необходимой памяти в виртуальном адресном пространстве.