指针更改值而不作为参数传递

时间:2013-08-10 10:06:38

标签: c pointers

以下是代码中的代码片段,涉及二叉树上的一些转换。

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)更改。

我的问题是,如果不将其传递给函数,它是如何改变的。

提前致谢。

5 个答案:

答案 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

中了解静态变量
  

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

相关问题