1

このコードでは、なぜ私のテストで結果が常に、、、12あるの3ですか?

#include <stdio.h>

void test() {
    int a;
    a++;

    printf("%d",a);
}

int main(int argc, char *argv[]) {
    test();
    test();
    test();
}

の変数は静的だと思いますtest()ね。なぜ?

4

5 に答える 5

9

変数は静的ではありません。初期化されていない変数にアクセスしています。動作は未定義です。

于 2013-02-01T12:41:07.033 に答える
3

他の答えが言ったように、あなたの変数は初期化されていません。おそらくコンパイラがスタックをゼロでクリーンアップするコードをコンパイルしたprolog(prologue)ために、1、2、および3が出力されます。

Cのローカル変数は、実際にはスタック上のオフセットを指しておりstack frame、呼び出しが返された後に復元されます。

私はグーグルでこれについて語ったアーティカルをランダムに選択しました。[関数呼び出しはどのように機能しますか?]。

これは、その[アセンブリプログラミングアセンブリ関数スタックフレームの説明]についてのビデオトークです(ここでも、ランダムに選択されています)。

また、ウィキペディアでは[コールスタック]についても説明しています。

于 2013-02-01T13:22:42.600 に答える
2

初期化されていない値で作業しているため...(この場合はランダムな動作)。

変数を初期化します(例を0に):

#include <stdio.h>
void test(){
    int a=0;
    a++;
    printf("%d",a);
}
int main(int argc, char *argv[]) {
    test();
    test();
    test();
}
于 2013-02-01T12:41:10.047 に答える
2

いいえ、変数はまったく静的ではありません!

https://stackoverflow.com/a/1597426/1758762

静的変数(ファイルスコープと関数static)はゼロに初期化されます:

int x; // zero
int y = 0; // also zero

    void foo() {
        static int x; // also zero
    }

非静的変数(ローカル変数)は不確定です。値を割り当てる前にそれらを読み取ると、未定義の動作が発生します。

void foo() {
    int x;
    printf("%d", x); // the compiler is free to crash here
}
于 2013-02-01T12:43:43.983 に答える
1

印刷しようとしている変数は静的ではなく、初期化されていないため、ガベージ値を取得しています。これはランダムに見えます。このプログラムを別のマシンで実行すると、出力が異なります。ゴミの価値が違う

それを回避するには、変数を何らかの値で初期化する必要があります

于 2013-02-01T12:43:56.277 に答える