为什么我的链表没有更新?

时间:2020-07-03 13:09:25

标签: c pointers linked-list pass-by-reference memory-address

使用调试器,似乎可以在函数内部成功创建链接列表,但不会在main的“外部”进行更新。我不知道为什么它不更新,因为我使用的是地址和动态内存分配,如果我没记错的话,一旦退出该功能就不会“清除”。

int populate(node* list)
{
    node* temp = NULL;

    while(1)
    {
        printf("insert word: ");
        char* word = getstring();
        if(strcmp(word, "stop") == 0)
        {
            break;
        }
        
        //create a node
        node* n = malloc(sizeof(node));
        if(n == NULL)
        {
            return 1;
        }
        
        //put stuff in node
        n->word = word;
        n->next = NULL;
        
        if (list == NULL) //first case only
        {
            list = n;
            temp = n;
        }
        else
        {
            //set previous next to current node
            temp->next = n;
            
            //set pointer to current node
            temp = temp->next;
        }
        
    }
}

int main()
{
    node* list = NULL;
    
    while(1)
    {
        printf("insert command: ");
        char* word = getstring();
        
        if (strcmp(word, "stop") == 0)
        {
            break;
        }
        else if (strcmp(word, "add") == 0)
        {
            populate(list);
        }
        else if (strcmp(word, "read") == 0)
        {
            readList(list);
        }
    }
}

在代码运行之后,分配给我的内存是否会自动释放?还是我每次测试程序时都会吞噬计算机内存的小块。 (我正在使用Xcode)

1 个答案:

答案 0 :(得分:1)

您需要将指针node* list作为双指针(指向指针的指针)而不是指针:

int populate(node** list)
{

这是因为C语言具有值语义。一切都通过价值传递。因此,当您将list传递给populate()时,将创建原始指针的副本。它们都指向相同的内存,但是对指针之一的更改不会反映在另一个中。这就是为什么您的列表永远不会更新的原因。

其他所有内容都将保持不变。调用填充函数时,您需要传递list的地址:

populate(&list);

populate()函数中,list的每次出现都会变成*list,因为您需要取消引用以获得原始指针。