Ошибка сегментации в C с массивом Dynami c - PullRequest
0 голосов
/ 13 марта 2020

Помогите, пожалуйста, найти ошибку в динамическом c выделении памяти.

Необходимо напечатать все слова, начинающиеся и заканчивающиеся одной буквой.

Алгоритм работает с stati c array, но при попытке создать динамический c массив произошла ошибка.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int len = 0;
    char str[10] = "aba cd geg ";
    char* word = NULL;
    int j = 0;
    int i = 0;
    int n = 0;
    while(str[i]!='\0')
        {
            if(!isspace(str[i]))
            {
                n++;
                word = (char*)realloc(word, (n* sizeof(char)));
                word[j] = str[i];
                j++;
                len++;
            }
            else
            {
                if(word[0] == word[len-1])
                {
                    j = 0;
                    while(j < len)
                    {
                        printf("%c", word[j]);
                        j++;
                    }
                }
                j = 0;
                len = 0;
                free(word);
                n = 0;
            }
            i++;
        }
  return 0;
}

1 Ответ

1 голос
/ 13 марта 2020

После освобождения word необходимо установить word на NULL, поскольку realloc может быть выполнено только для пустого указателя или действительного указателя, который ранее был возвращен malloc, calloc или realloc.

  ...
  len = 0;
  free(word);    // after this line, word is no more a valid pointer
  word = NULL;   // <<<< insert this
  n = 0;
  ...

Другими словами, этот шаблон всегда неверен:

 free(foobar);
 foobar = realloc(foobar, ...);

Другая возможность вовсе не состоит в том, чтобы вообще освободить word и позволить следующему realloc позаботьтесь об этом, что в данном случае, скорее всего, более эффективно.

  ...
  len = 0;
  // free(word);     remove this line
  n = 0;
  ...

, но тогда вам нужно позвонить free(word); в конце программы, непосредственно перед return 0;

Итак, конец вашей программы будет выглядеть так:

      ...
      j = 0;
      len = 0;
      n = 0;
    }
    i++;
  }

  free(word);
  return 0;
...