Вы говорите, что malloc не работает и возвращает NULL:
Очевидная причина, на которую вы должны обратить внимание в первую очередь, состоит в том, что ваша куча «заполнена» - то есть память, которую вы запросили для malloc, не может быть выделена, потому что она недоступна.
Необходимо помнить о двух сценариях:
a: У вас куча 16 Кб, вы уже получили 10 Кл, и вы пытаетесь собрать еще 10 Кб. Ваша куча просто слишком мала.
b: Чаще всего у вас есть куча 16 Кб, вы выполняли кучу вызовов malloc / free / realloc, и ваша куча заполнена менее чем на 50%: вы вызываете malloc для 1 КБ, и она НЕ СДЕЛАЕТ - что происходит? Ответ - свободное место в куче фрагментировано - нет 1K свободной памяти, которую можно вернуть. C Менеджеры кучи не могут сжать кучу, когда это происходит, поэтому вы, как правило, не в порядке. Существуют методы, позволяющие избежать фрагментации, но трудно понять, действительно ли это проблема. Вам нужно будет добавить регистрационные шайбы в malloc и free, чтобы вы могли понять, какие операции с динамической памятью выполняются.
EDIT:
Вы говорите, что все malloc происходят при запуске, поэтому проблема не в фрагментации.
В этом случае динамическое распределение должно быть легко заменено статическим.
старый пример кода:
char *buffer;
void init()
{
buffer = malloc(BUFFSIZE);
}
новый код:
char buffer[BUFFSIZE];
Как только вы сделаете это везде, ваш LINKER должен предупредить вас, если все не может поместиться в доступной памяти. Не забудьте уменьшить размер кучи, но имейте в виду, что некоторые системные функции времени выполнения все еще могут использовать эту кучу, поэтому вы не сможете полностью ее удалить.