为什么名单会改变 #包括 #包括 //结构定义 类型定义结构列表元素 { 字符*值; 结构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);