что произойдет, если я не освободлю указатель перед его выделением - PullRequest
0 голосов
/ 30 января 2012

Я делаю пользовательскую функцию копирования следующим образом:

  if (s1 == NULL || s2 == NULL || s2->buf == NULL)
    return;

  if (s1->len + 1 < s2->len + 1)
    {
      if (s1->buf)
        free (s1->buf);

      s1->buf = (char *) malloc (s2->len + 1);
      if (s1->buf == NULL)
      return;
    }

  for (int i = 0; i < s2->len; i++)
    s1->buf[i] = s2->buf[i];

  s1->len = s2->len;

, где s1 и s2 - просто структурные указатели, в которых есть указатель на символ и целое число без знака.

  if (s1->len + 1 < s2->len + 1)
    {
      if (s1->buf)
        free (s1->buf);

      s1->buf = (char *) malloc (s2->len + 1);
      if (s1->buf == NULL)
      return;
    }

это проверит, достаточно ли места внутри s1 для места s2.если нет, он проверит существующую память и освободит ее.после того, как это будет сделано, он выделит новый блок памяти для s1, который имеет размер s2 + 1 (включая \ 0).

здесь я запутался

если в указателе char достаточно места для s2, чтобы поместиться в s1 (включая \ 0), и он не освобождает () и снова не вызывает malloc (), он просто присваивает цикл for, сохранит ли оноригинальное содержание s1?

1 Ответ

1 голос
/ 30 января 2012

если в указателе char достаточно места для s2, чтобы поместиться в s1 (включая \ 0) и он не освобождает () и снова вызывает malloc (), он просто присваивает с циклом for, будет ли оно сохранять исходное содержимое s1?

Если места достаточно, вам не нужно снова освобождать или выполнять malloc. Просто держись за выделенный кусок.

Вызов malloc не является чем-то особенным: он просто дает вам указатель, с которого вы можете начать хранить данные. Если у вас уже есть этот указатель, отлично.

...