Сегфаул на стрток в т - PullRequest
       24

Сегфаул на стрток в т

0 голосов
/ 12 октября 2019
typedef struct S_Linear_Chain *Chain;

struct S_Linear_Chain
{
    char mot[20];
    int occ;
    Chain next;
};

Я кодирую список цепочек строк, и мне нужно токенизировать мой текст. Все мои функции работают индивидуально, но в функции construire_list () я получаю segfault. Я думаю, это потому, что моя ул постоянно. Chain new_Chain () {return NULL;}

Chain insereDebut(Chain deb,char* c)
{
    Chain new = malloc(sizeof(struct S_Linear_Chain));
    strcpy(new->mot,c);
    new->next = deb;
    new->occ++;
    return new;
}

Chain construire_list()
{
    char s1[MAX];
    Chain l = new_Chain();
    fgets(s1, MAX, stdin);
    char * s = strdup(s1);
    const char * separators = " ";
    char * strToken = strtok (s, separators );
    while ( strToken != NULL ) {
        insereDebut(l,strToken);

      }


    return l;
}

Не знаю, как решить эту проблему, спасибо за помощь

1 Ответ

2 голосов
/ 12 октября 2019

Я думаю, это потому, что моя ул постоянна.

Почему вы так думаете? Ваша строка не константа: она прямо здесь:

char * s = strdup(s1);

В вашем коде есть много ошибок (на самом деле удивительно, что столько ошибок может быть подсчитано в столь малом количестве строк кода)).

  1. В вызове strdup нет необходимости: вы также можете легко токенизировать s1.
  2. Память, возвращаемая strdup, просочилась.
  3. При вызове strtok будет найден первый токен. Остальная часть строки останется непокрытой (вы должны повторно вызывать strtok, чтобы токенизировать всю строку).
  4. Вы должны удалить трейлинг \n, который будет читать fgets.
  5. Так какstrToken никогда не обновляется, ваш цикл while будет работать вечно, пока вы не исчерпаете всю память (что, вероятно, является причиной вашего сбоя).
  6. Поскольку вы игнорируете возвращаемое значение insereDebut, выутечка памяти и здесь. Скорее всего, код должен быть: l = insereDebut(l,strToken);
  7. В insereDebut эта строка: new->occ++; увеличивает неинициализированное значение (начальное значение new->occ не определено).

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

...