为什么名单会改变 #包括 #包括 //结构定义 类型定义结构列表元素 { 字符*值; 结构ListElement*下一步; }ListElement,*列表; 列表后推列表(列表li,字符*x); int main(int argc,字符**argv) { char val[]=“12345678987456321069”; char dest[5]; //这里的列表是空的 List liste=new_List(); strncpy(目的地、价值4); //推送法 liste=向后推列表(liste,dest); //dest的修改 strncpy(dest,val+4,4); //当我打印列表时,结果没有推送方式就变了为什么?? 打印列表(列表); 返回0; } //推送方法描述 列表后推列表(列表li,字符*x) { ListElement*元素; 元素=malloc(sizeof(*元素)); 元素->值=x; 元素->下一步=空 如果(是空的列表(li)) 返回元素; 列表元素*温度; 温度=li; while(临时->下一步!=NULL) 温度=温度->下一步; temp->next=元素; 返回李; }

为什么名单会改变 #包括 #包括 //结构定义 类型定义结构列表元素 { 字符*值; 结构ListElement*下一步; }ListElement,*列表; 列表后推列表(列表li,字符*x); int main(int argc,字符**argv) { char val[]=“12345678987456321069”; char dest[5]; //这里的列表是空的 List liste=new_List(); strncpy(目的地、价值4); //推送法 liste=向后推列表(liste,dest); //dest的修改 strncpy(dest,val+4,4); //当我打印列表时,结果没有推送方式就变了为什么?? 打印列表(列表); 返回0; } //推送方法描述 列表后推列表(列表li,字符*x) { ListElement*元素; 元素=malloc(sizeof(*元素)); 元素->值=x; 元素->下一步=空 如果(是空的列表(li)) 返回元素; 列表元素*温度; 温度=li; while(临时->下一步!=NULL) 温度=温度->下一步; temp->next=元素; 返回李; },c,linked-list,C,Linked List,列表元素不存储字符串的副本,它只存储指向dest的指针。当您更改dest的内容时,当您通过list元素打印时,当然可以看到该更改;是同一个缓冲区 修复方法是在列表元素中创建副本,例如通过更改以下内容: #include <stdio.h> #include <string.h> //struct definition typedef struct ListElement { char *value; struct ListElem

列表元素不存储字符串的副本,它只存储指向
dest
的指针。当您更改
dest
的内容时,当您通过list元素打印时,当然可以看到该更改;是同一个缓冲区

修复方法是在列表元素中创建副本,例如通过更改以下内容:

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

//struct definition
typedef struct ListElement
    {
        char *value;
        struct ListElement *next;
    }ListElement, *List;

List push_back_list(List li, char *x);

int main(int argc, char **argv)
{
    char val[]= "12345678987456321069";      
    char dest[5];

    //here the list is empty
    List liste=new_list();
    strncpy(dest, val, 4);

    //push method
    liste=push_back_list(liste,dest);

    //modification of dest
    strncpy(dest, val+4, 4);

    //when i print list, the result were change without push method why??
    print_list(liste);  
    return 0;
}

//push method description
List push_back_list(List li, char *x)
{
    ListElement *element;

    element = malloc(sizeof(*element));
    element->value= x;
    element->next = NULL
    if(is_empty_list(li))
        return element;
    ListElement *temp;
    temp = li;
    while(temp->next != NULL)
        temp = temp->next;

    temp->next = element;
    return li;
}
致:

如果您有
strdup()
(它不是标准的,但很常见)。当然,这会导致分配失败。您还可以使list元素包含适当的缓冲区,但这会限制您可以支持的字符串的大小。选择,选择。:)

加1(因为它不允许我加一个加号,有人请把它标记为健谈,但让我们放松一下读一次),特别是在选项,选项:。
strncpy(dest,val,4)
dest将不会以null结尾(它是未序列化的,因此
dest[4]
不需要为零。
element->value = x;
element->value = strdup(x);