我有一个功能,可以在我的结构列表中添加一个结构。执行此功能后,我想清除(分配NULL)到每个char [i],但不幸的是,在我这样做之后我从列表中丢失了数据!我认为在分配后我不需要担心这些数据。为什么会这样?
有问题的文件
char name[20], surname[20], id[12];
addToList(head, &name, &surname, &id); // Everything here is fine
for (int i = 0; i < a; i++)
{
name[i] = NULL; // after performing this i lose data from head!
}
for (int i = 0; i < b; i++)
{
surname[i] = NULL; // after performing this i lose data from head!
}
for (int i = 0; i < c; i++)
{
id[i] = NULL; // after performing this i lose data from head!
}
功能 addToList
void addToList(struct List * head, char *name, char *surname, char *id)
{
struct List *tmp = malloc(sizeof(struct List));
tmp = head;
struct Person *newPerson = malloc(sizeof(struct Person));
newPerson->id = id;
newPerson->name = name;
newPerson->surname = surname;
if (tmp->person == NULL)
{
head->next = malloc(sizeof(struct List));
head->person = newPerson;
head->next = NULL;
}
/* Futher code */
答案 0 :(得分:4)
问题在于,如果您在其他地方更改name
,它也会更改newPerson->name
,因为它们都指向内存中的相同位置。相反,你要做的就是像这样复制name
newPerson->name = strdup(name);
这将分配足够的内存来存储name
的新副本,然后将其复制到新内存中。如果name
没有完全占用它,它将不会分配相同大小的内存。
char name[100]="test"; // name is 100 bytes in size
char *name2=strdup(name); // name2 is 5 bytes in size
答案 1 :(得分:-1)
您无法指定NULL
指向char
元素的指针,您需要
name[0] = '\0';
相当于根据字符串在内存中的表示方式清除它。
你将错误的类型传递给你的函数,你应该阅读更多有关指针的内容并理解它们指向内存,当你在一个地方修改内存时,你会在各处传播效果。
所以首先修正yor程序的正确性,你传递的是不兼容的类型,你应该允许你的编译器告诉你这一点,同时修复注释中提到的内存泄漏,然后学习如何复制内存的内容分配指针,你的代码应该正常工作。
因为实际上,您的结构成员几乎指向与“ temporary ”变量相同的内存。我差点说,因为你不使用&
运算符将它们传递给函数。
总结代码中的问题
您无法将NULL
分配给char
类型,NULL
是指针,而char
则不是。
您不能使用&
运算符的地址将数组传递给addToList()
函数,因为传递的对象的类型与预期参数的类型不同,即使它现在正在工作也是错的。我工作,因为数组的地址和它的第一个元素的地址是相同的,但&name + 1
和name + 1
有不同的地址,所以如果你不'strdup()
将无法正常工作解决这个问题。
您不需要为临时指针分配内存,指针只指向内存,它不存储数据。如果您想指向head
,请执行此操作,
tmp = head;
完全有效,但在此之后,您对head
所做的任何事情都会发生在tmp
,反之亦然。
您需要复制addToList()
函数内的数据,因为我在前一段中对指针的说法,使用strdup()
,但请记住修复{{ 1}}错误。