typedef struct S_Linear_Chain *Chain;
struct S_Linear_Chain
{
char mot[20];
int occ;
Chain next;
};
我正在编写一个字符串链列表,我需要标记我的文本。 我所有的函数都单独工作,但在construire_list()
函数中我得到一个段错误。 我想这是因为我的str是恒定的。 链 new_Chain(( { 返回 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);
你的代码中有很多错误(实际上很有趣,这么多错误可以在这么少的代码行中计算出来(。
- 调用
strdup
是不必要的:您可以轻松地标记s1
。 strdup
返回的内存已泄漏。- 对
strtok
的调用将找到第一个令牌。该行的其余部分将保持未标记化(您必须反复调用strtok
以标记整行(。 - 您应该删除
fgets
将读取的尾随n
。 - 由于
strToken
永远不会更新,因此您的while
循环将永远运行,直到您耗尽所有内存(这可能是崩溃的原因(。 - 由于您忽略了
insereDebut
的返回值,因此此处也会泄漏内存。代码很可能是:l = insereDebut(l,strToken);
- 在
insereDebut
中,此行:new->occ++;
递增未初始化的值(new->occ
的初始值未定义(。
请学习如何调试小程序。