使用调试器,似乎可以在函数内部成功创建链接列表,但不会在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)
答案 0 :(得分:1)
您需要将指针node* list
作为双指针(指向指针的指针)而不是指针:
int populate(node** list)
{
这是因为C语言具有值语义。一切都通过价值传递。因此,当您将list
传递给populate()
时,将创建原始指针的副本。它们都指向相同的内存,但是对指针之一的更改不会反映在另一个中。这就是为什么您的列表永远不会更新的原因。
其他所有内容都将保持不变。调用填充函数时,您需要传递list
的地址:
populate(&list);
在populate()
函数中,list
的每次出现都会变成*list
,因为您需要取消引用以获得原始指针。