0
void testFunc(int);

int main(int argc, char** argv) {

    testFunc(1);
    testFunc(2);
    testFunc(3);

    return (EXIT_SUCCESS);
}

void testFunc(int another)
{
    int num;
    printf("num: %i\n", num);
    num = another;
}

出力: 数値: 127383283 数値: 1 数値: 2

毎回何かに割り当てる前に変数を出力している場合、 static キーワードなしで常にガベージ値を取得するべきではありませんか?

4

6 に答える 6

6

ガベージ値を取得しています- この場合、それらのガベージ値は、たまたま関数の前回の呼び出しで割り当てた値です。

の呼び出しの間に別の関数を呼び出しtestFunc()たり、より高い最適化設定でコンパイルしたり、別のコンパイラでコンパイルしたりすると、おそらくまったく異なる結果が得られるでしょう。

于 2012-11-14T04:47:22.393 に答える
3

変更されていないその変数に対して毎回同じメモリを使用することになるためです。

この動作は未定義と見なされます。特定のケースでは確実に機能する可能性がありますが、すべてのケースで信頼できるわけではありません。

そして、地獄のためにいくつかの答えを受け入れ始めませんか?

于 2012-11-14T04:47:23.003 に答える
2

num初期化なしの値はIndeterminateです。
それは何でもかまいません。それが具体的なものであることに依存することはできません。
この不確定な値を使用すると、未定義の動作が発生することに注意してください。したがって、このプログラムには未定義の動作があります。

于 2012-11-14T04:47:22.847 に答える
1

C/C++ では、自動変数は、必要な値に初期化しない限り、特定の値を持つことが保証されません。これは設計によるものです

于 2012-11-14T04:47:52.393 に答える
1

事故です。別の機能を追加します。

int use_stack(void)
{
    int a[4] = { rand(), rand(), rand(), rand() };
    int j = 0;
    for (int i = 0; i < 4; i++)
        j += a[i];
    return j;
}

最初の 2 つの呼び出しの後にtestFunc()呼び出します。の「保存された値」としてランダムな値が表示される可能性がありますtestFunc()

正式には、表示されている動作は未定義の動作であり、何かが起こる可能性があります。

于 2012-11-14T04:49:29.597 に答える
-1

静的とは、コンパイル後に変更できないことを意味します。値を宣言すると、コードの存続期間中はそのままになります。関数の最後に値を設定しているため、2回目と3回目まで機能します。

static に設定すると、関数内の is に値を割り当てることができなくなります。

于 2012-11-14T04:49:09.113 に答える