Зачем освобождать память в C?
Потому что неосвобождённая память остаётся занятой даже после выхода указателя за пределы области видимости. В итоге если вы будете только аллоцировать память, но не освобождать её, то рано или поздно программа сожрёт всю память в системе.
Потому что это называется "утечка памяти", когда программа выделяет ее, но не освобождает. Если это мелкая программа, то похрен - программа кончилась, вся ее память освободилась. Но тут нарабатывается плохая привычка и в итоге мы получаем что-то типа Firefox, который жрет память тоннами и не освобождает. А когда в системе кончается реальная память - начинает работать менеджер страничного обмена (свопа), который вытесняет неиспользуемые страницы на диск - это во-первых жрет ресурсы, во-вторых диск бестолково гоняет. А когда кончается и страничная память (обьем свопа) - система тупо встанет.