Ошибка повторного использования функции ecvt UNIX C

Как локально избавится от утечек памяти при повторном использовани функции ecvt

Вызов в main.c

my_sprintf(str, "hello |%E|%E|\n", 5.65, 5.65);

Непосредственно обработчик:

void cat_scientific_float_to_str(char **str, char **end, s21_printf_spec *spec, va_list args) {
   long double num;
  get_float_from_parameter(&num, spec, args);

  int lim = count_digit_in_num((signed long)num, 10);

  if (spec->precision < 0)
    spec->precision = 6;
  if (spec->precision > 0)
    lim += spec->precision + 1;

  if (spec->flags & PLUS || spec->flags & SPACE || (double)num < 0)
    ++lim;

  if ((double)num < 0)
    spec->flags &= ~(PLUS | SPACE);

  int decimal, sign;
  char    *buffer = ecvt((double)num, spec->precision + 1, &decimal, &sign);

  int l_dec_num = count_digit_in_num((signed long)decimal, 10);

  lim += 4 + (l_dec_num > 2 ? l_dec_num - 2 : 0);

  if (!(spec->flags & LEFT) && !(spec->flags & ZEROPAD))
      cat_symbol_in_str(str, end, spec->field_width - lim, ' ');
    
  if (spec->flags & PLUS) {
    spec->flags &= ~(SPACE);
    cat_symbol_in_str(str, end, 1, '+');
  } else if (spec->flags & SPACE) {
    cat_symbol_in_str(str, end, 1, ' ');
  } else if ((double)num < 0) {
    cat_symbol_in_str(str, end, 1, '-');
    num = -num;
  }
    
  if (spec->flags & ZEROPAD && !(spec->flags & LEFT))
    cat_symbol_in_str(str, end, spec->field_width - lim, '0');

  cat_symbol_in_str(str, end, 1, buffer[0]);

  if (spec->precision > 0) {
    cat_symbol_in_str(str, end, 1, '.');
    cat_type_default_to_str(str, end, &buffer[1], spec->precision);
  }
  if (spec->flags & SMALL)
    cat_symbol_in_str(str, end, 1, 'e');
  else
    cat_symbol_in_str(str, end, 1, 'E');

  if (decimal >= 0)
    cat_symbol_in_str(str, end, 1, '+');
  else
    cat_symbol_in_str(str, end, 1, '-');

  if (decimal < 10)
    cat_symbol_in_str(str, end, 1, '0');

  cat_signed_int_to_str((signed long)decimal - 1, str, 10, spec);

  free(buffer);
  
  if (spec->flags & LEFT)
    cat_symbol_in_str(str, end, spec->field_width  -  lim, ' ');
}

void get_float_from_parameter(long double *n, s21_printf_spec *spec, va_list args) {
  if (spec->flags & LONG_FLAG_FLOAT)
    *n = (long double)va_arg(args,  double long);
  else
    *n = (long double)va_arg(args, double);
}

Код ошибки valgrind:

str(66639,0x10f826e00) malloc: *** error for object 0x7f967b406170: pointer being freed was not allocated
str(66639,0x10f826e00) malloc: *** set a breakpoint in malloc_error_break to debug

Ответы (0 шт):