以下是代码中的代码片段,涉及二叉树上的一些转换。
void fixPrevPtr(struct node *root)
{
static struct node *pre = NULL;
if (root != NULL)
{
fixPrevPtr(root->left);
root->left = pre;
pre = root;
fixPrevPtr(root->right);
}
}
此处'pre'在每个函数中初始化为NULL。但是当函数输入'if'子句并且 root-> left = pre 时,执行了,pre pre被分配的不是NULL。它以某种方式被函数 fixPrevPtr(root-> left)更改。
我的问题是,如果不将其传递给函数,它是如何改变的。
提前致谢。
答案 0 :(得分:3)
这个位不正确
这里'pre'在每个函数中初始化为NULL。
由于static关键字,它只被初始化一次。如果函数更改了值,则下次函数具有该值而不是null。
答案 1 :(得分:2)
pre
是静态的,所以它保持了从呼叫到呼叫的价值。 fixPrevPtr()
是递归的(自称),因此对pre
“的任何更改都会”。“
答案 2 :(得分:2)
static struct node *pre = NULL;
由于pre
关键字而初始化static
。
但是下次您输入此功能时,pre
将为其分配最后一个值。
我建议你阅读:Static variable inside of a function in C
在C标准中:
6.2.4对象的存储持续时间
使用外部或内部链接声明标识符的对象,或使用存储类说明符静态声明的对象具有静态存储持续时间。它的生命周期是整个程序的执行,它的存储值只在程序启动之前初始化一次。
答案 3 :(得分:0)
pre
是一个静态值,它存储在data segment
中,它的范围不仅是fixPrevPtr
,还包括此过程中的所有其他函数,当然fixPrevPtr
1}}本身可以改变它。
答案 4 :(得分:0)
您在static
添加了struct node * pre = NULL
关键字,这就是为什么在执行pre = root;
时保留前一个函数调用的值的原因。
删除static
,你很高兴
您可以从此链接http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.6.html
中了解静态变量即使在定义它们的块终止后,静态自动变量仍然存在。因此,在对同一函数的重复函数调用之间保留函数中静态变量的值。