-4

私は「ハッキング、搾取の芸術」という本を読んでいますが、このコード サンプルは本当に私を混乱させます。

これは、グローバル変数スコープのコンテキスト内にあります。

#include <stdio.h>

void function() { // An example function, with its own context
    int var = 5;
    static int static_var = 5; // Static variable initialization
    printf("\t[in function] var = %d\n", var);
    printf("\t[in function] static_var = %d\n", static_var);
    var++; // Add one to var.
    static_var++; // Add one to static_var.
}

int main() { // The main function, with its own context
    int i;
    static int static_var = 1337; // Another static, in a different context
    for(i=0; i < 5; i++) { // Loop 5 times.
        printf("[in main] static_var = %d\n", static_var);
        function(); // Call the function.
    }
}

出力は次のとおりです。

reader@hacking:~/booksrc $ gcc static.c
reader@hacking:~/booksrc $ ./a.out
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 5
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 6
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 7
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 8
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 9
reader@hacking:~/booksrc $

問題は、なぜ[in function] var = 5安定しているのかということです。ローカル関数内var++;と同様に定義しました。static_var++;何が起こっている?

4

3 に答える 3

5

後に

var++;

ではfunction()、そのローカル変数はもう使用されていません。スコープ外になり、関数が戻ると存在しなくなります。function()次回 が呼び出されると、 newがvar割り当てられ、 に初期化され5ます。

2 つstatic_varの s には静的な保存期間があり、プログラムの存続期間全体にわたって存在します。これらの変更は保持され、一度だけ初期化されます。

そのfunction()ため、次に が呼び出されると、前回の呼び出しで行われたインクリメントがまだ有効であり、最初の呼び出しを除いて初期化は実行されません。

于 2013-01-12T18:36:40.763 に答える
3

var静的ではないためです。関数が呼び出されるたびに異なるインスタンスになります。

于 2013-01-12T18:36:16.583 に答える
2

これがまさに、静的変数と非静的変数を区別するものです。静的変数には static-storage-duration があります。つまり、変数はプログラムの実行中も存続します。非静的変数には自動保存期間があります。つまり、それが作成されたスコープの最後 (この場合は の最後function) で消えます。変数が破棄されると、次に関数が呼び出されたときに、その変数の新しいインスタンスが作成されます。

于 2013-01-12T18:38:32.320 に答える