-3

以下は、バイナリ ツリーでの変換を含むコードのコード スニペットです。

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 は NULL ではありませんでした。関数fixPrevPtr(root->left)によって何らかの形で変更されました。

私の質問は、関数に渡されることなくどのように変更されるのかということです。

前もって感謝します。

4

5 に答える 5

3

このビットは正しくありません

ここで、'pre' はすべての関数で NULL として初期化されます。

static キーワードにより、一度だけ初期化されます。関数が値を変更すると、次回関数は null の代わりにその値を持ちます。

于 2013-08-10T10:09:07.530 に答える
2
static struct node *pre = NULL;

キーワードpreのため、一度初期化します。static

ただし、次にこの関数を入力するpreと、最後の値が割り当てられます。

これを読むことをお勧めします:Cの関数内の静的変数

C標準では:

6.2.4 オブジェクトの保存期間

識別子が外部リンケージまたは内部リンケージで宣言されているか、ストレージ クラス指定子staticで宣言されているオブジェクトには、静的ストレージ期間があります。その存続期間はプログラムの実行全体であり、格納された値はプログラムの起動前に一度だけ初期化されます

于 2013-08-10T10:12:14.573 に答える
2

pre静的であるため、呼び出しから呼び出しまで値を保持します。 fixPrevPtr()は再帰的 (自分自身を呼び出す) であるため、変更はすべてpre「固着」します。

于 2013-08-10T10:09:06.740 に答える
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 に答える