-3

Following is a code snippet from a code involving some transformations on a binary tree.

void fixPrevPtr(struct node *root)
{
    static struct node *pre = NULL;

    if (root != NULL)
    {
        fixPrevPtr(root->left);
        root->left = pre;
        pre = root;
        fixPrevPtr(root->right);
    }
}

Here 'pre' is initialised in every function as NULL. But when function entered 'if' clause and root->left=pre, was executed, pre that was being assigned was not NULL. It was somehow changed by the function fixPrevPtr(root->left).

My question is that how does it get changed without being even passed into the function.

Thanks in advance.

4

5 回答 5

3

此位不正确

这里的'pre'在每个函数中都被初始化为NULL。

由于 static 关键字,它只被初始化一次。如果函数更改了值,那么下次函数具有该值而不是 null。

于 2013-08-10T10:09:07.530 回答
2

pre是静态的,因此它在每次调用中保持其价值。 是递归的(调用自身),因此对“棒”fixPrevPtr()的任何更改。pre

于 2013-08-10T10:09:06.740 回答
2
static struct node *pre = NULL;

pre由于static关键字而初始化一次。

但是下次您输入此函数时,pre将为其分配最后一个值。

我建议您阅读:C 中函数内部的静态变量

在 C 标准中:

6.2.4 对象的存储期限

使用外部或内部链接或存储类说明符static声明其标识符的对象具有静态存储持续时间。它的生命周期是程序的整个执行过程,它的存储值只在程序启动之前初始化一次

于 2013-08-10T10:12:14.573 回答
0

pre是一个静态值,它存储在 中data segment,它的作用域不仅是fixPrevPtr这个过程中的所有函数,也是这个过程中的所有其他函数,所以fixPrevPtr它自己当然可以改变它。

于 2013-08-10T10:12:32.823 回答
0

您添加了static关键字,struct node * pre = NULL这就是为什么它在执行时保留先前函数调用的值pre = root;。删除static,你很高兴

您可以从此链接http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.6.html阅读有关静态变量的信息

即使在定义它们的块终止后,静态自动变量仍然存在。因此,函数中静态变量的值在对同一函数的重复函数调用之间保留。

于 2013-08-10T10:12:39.480 回答