C 当我更改字符数组时,链表会更改

C 当我更改字符数组时,链表会更改,c,string,pointers,struct,linked-list,C,String,Pointers,Struct,Linked List,问题是当我第二次输入一个任意单词时,if语句中的q->ch会变成一个新词 .. 我希望q成为链表开始的指针 while(true){ tmp=(list*)malloc(sizeof(list)); printf("\n put any word:"); scanf("%s",name); printf("\n"); tmp->ch=name; if (i==0) { q=p=tmp; } e

问题是当我第二次输入一个任意单词时,if语句中的q->ch会变成一个新词 .. 我希望q成为链表开始的指针

while(true){
    tmp=(list*)malloc(sizeof(list));
    printf("\n put any word:");
    scanf("%s",name);
    printf("\n");
    tmp->ch=name;
        if (i==0)
    {
        q=p=tmp;

    }
    else
    {
        p->nxt=tmp;
        p=tmp;
    }

    printf("when you want to end press y \n");
    scanf(" %c",&c);
    if (c=='Y' || c=='y')
    {
        break;
    }
    i++;
}   

q
确实指向列表中的第一个节点。问题是当你这么做的时候

tmp->ch = name
您只是在复制一个地址。因此,每个节点都指向同一个bufer,该bufer将以最后一个单词结尾

要修复它,需要复制字符串:

tmp->ch = strdup (name)

您正在将
name
的地址分配给
tmp->ch
name
的地址内容总是被
scanf()
覆盖。无法使用
=
符号复制字符串和字符数组。您需要使用
strcpy()
和family将字符串从一个数组复制到另一个数组。但是,如果您为
name
动态分配内存,并将
ch
定义为
char*
,那么您的解决方案就可以工作了。看起来您只有一个字符串数组,并且一直在覆盖它。每次分配一个新的
名称
。非常感谢我现在知道了:)请不要在缩进代码时使用制表符,始终使用空格。最后,记住释放所有那些“dup”字符串,这样就不会产生内存泄漏。