При попытке выделить большой кусок памяти, функции malloc() и realloc() возвращают ненулевой указатель,
но при записи в выделенную область данных, в какой то момент возникает ошибка сегментации.
Ну вообще-то вы описываете классические симптомы поведения виртуальной памяти в системе с разрешенным overcommit.
То есть при выделении памяти никакого физического выделения не происходит, а происходит лишь резервирование соответствующего диапазона адресов в адресном пространстве процесса. Никаких физических ресурсов за этими адресами изначально не стоит. То есть вам изначально выделяют "воображаемую" память. Вы получаете не память, а лишь диапазон адресов.
Выделение физических ресурсов, т.е. сопоставление вашему диапазону адресов настоящих физических страниц в ОЗУ и/или в своп-файле, начнется только тогда, когда вы начнете физически записывать в эту память данные. Оно будет делаться постранично (по 4 кб) по мере необходимости. И если в какой-то момент окажется, что физических ресурсов недостаточно, вы получите ошибку при записи в как будто уже выделенную "вашу" память.
То есть выделение памяти в такой системе - это не более чем вялое обещание, что память "может быть найдется", когда вы действительно начнете с ней работать. А в реальности она может и не найтись...