Для такого анализа последовательного потока, возможно, просто используйте флаг. Начните с очищенного флага. Когда вы видите ! , установите флаг. Когда цифры приходят, когда установлен флаг, сохраните их в массиве. Когда вы видите что-то, что не является ди git, снимите флажок.
Вы можете даже накапливать цифры в целое число на лету (пропуская массив), если это будет конечный результат.
Лично я не использую malloc / free на Arduino, и здесь он не нужен.
HTH!