为什么我在清除变量

时间:2017-03-17 11:41:45

标签: c

我有一个功能,可以在我的结构列表中添加一个结构。执行此功能后,我想清除(分配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 */

2 个答案:

答案 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 ”变量相同的内存。我差点说,因为你不使用&运算符将它们传递给函数。

总结代码中的问题

  1. 您无法将NULL分配给char类型,NULL是指针,而char则不是。

  2. 您不能使用&运算符的地址将数组传递给addToList()函数,因为传递的对象的类型与预期参数的类型不同,即使它现在正在工作也是错的。我工作,因为数组的地址和它的第一个元素的地址是相同的,但&name + 1name + 1有不同的地址,所以如果你不'strdup()将无法正常工作解决这个问题。

  3. 您不需要为临时指针分配内存,指针只指向内存,它不存储数据。如果您想指向head,请执行此操作,

    tmp = head;
    

    完全有效,但在此之后,您对head所做的任何事情都会发生在tmp,反之亦然。

  4. 您需要复制addToList()函数内的数据,因为我在前一段中对指针的说法,使用strdup(),但请记住修复{{ 1}}错误。