typedef struct S_Linear_Chain *Chain;

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

我正在编写字符串链列表,我需要标记我的文本。
我所有的函数都是单独工作的,但是在construire\u list()函数中,我得到了一个segfault。
我想是因为我的str是恒定的。
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;
}

我不知道怎么解决这个问题,谢谢你的帮助

最佳答案

我想是因为我的str是恒定的。
你为什么这么想?你的str不是恒定的:就在这里:

char * s = strdup(s1);

在你的is代码中有很多错误(在这么少的代码行中可以计算出这么多错误,这真的很有趣)。
调用strdup是不必要的:您可以同样轻松地标记s1
strdup返回的内存泄漏。
调用strtok将找到第一个令牌。该行的其余部分将保持不变(您必须反复调用strtok来标记整行)。
您应该删除\n将读取的尾部fgets
由于strToken从未更新,因此您的while循环将永远运行,直到耗尽所有内存(这可能是导致崩溃的原因)。
由于忽略了insereDebut的返回值,因此也会在此处泄漏内存。代码很可能是:l = insereDebut(l,strToken);
insereDebut中,此行:new->occ++;增加未初始化的值(未定义new->occ的初始值)。
请学习how to debug small programs

关于c - 在C中的strtok上出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58352950/

10-09 07:12