我有一个结构定义为:
typedef struct node Node;
struct node {
char val;
Node* tail;
};
我发起如下链接列表:
Node* header;
Node node_one;
node_one.val = 'a';
node_one.tail = 0;
header = &node_one;
然后我继续向此列表添加节点。现在,当我对此链表使用以下打印功能时,它的工作方式与预期的方式相同:
void printlist(Node* header) {
do{
printf("%c ", header->val);
header = header->tail; // aren't we modifying the header itself here?
} while(header->tail!=0);
printf("%c --> NULL", header->val);
}
从main()
拨打printlist(header);
到目前为止一切顺利。我没有得到的是,在不对列表进行任何更改的情况下,当我在第二次,第三次,第四次调用此打印功能时,它始终有效。它打印列表的元素。但我所期待的是这个函数只能工作一次,因为我正在修改标题指针本身,所以不应该在运行这个打印函数一次后丢失内存中的列表?它怎么会不止一次起作用?
答案 0 :(得分:1)
下面函数中的标题可能是一个局部变量(函数printlist的本地变量)。所以你的原始标题(主标题)根本没有变化。因此,无论何时调用此函数,它仍然会打印列表。
void printlist(Node* header){
do{
printf("%c ", header->val);
header = header->tail; // aren't we modifying the header itself here?
}while(header->tail!=0);
printf("%c --> NULL", header->val);
}
答案 1 :(得分:1)
这是因为您在header
正文中使用的printlist()
与您在header
中引用的main()
不同header
。这些是恰好具有相同名称的不同变量。
您可以通过在printlist()
中查找mylist
的名称来试验这一原则:例如将其称为mysql2
,整个程序仍然有用。