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