0

次のプログラムがガベージ値を出力しない理由。私が知っているように、スタックに割り当てられたメモリ(つまりコンパイル時)とスタックメモリには、ガベージ値が含まれています。ただし、ガベージ値は出力されません。1を印刷しています。関数g()で、配列bのサイズ>配列aのサイズの場合にのみ、ガベージ値を出力します。g()の配列のサイズ>配列aのサイズの場合、12個の1(この場合)を出力し、ガベージ値として残ります。

    void f()
    {
        int a[12],i=0;
        for(i=0;i<12;i++)
          a[i]=1;
    }
    void g()
    {
        int b[12],i=0;
        for(i=0;i<12;i++)
          printf("%d\n",b[i]);
    }
    int main()
    {
         f();
         g();
          return 0;
    }

アレイbに割り当てられたメモリは、以前にアレイaに割り当てられたメモリと同じですか?

4

1 に答える 1

5

それはゴミであり、関数によって残されますf()-そしてこの効果は定義されていません。この影響は、コンパイラがスタック上のローカル変数を割り当ておよび割り当て解除する方法の副産物です。

コンパイラは、関数が戻ったときにスタックをランダムデータで完全に上書きするコードを生成することも、スタックポインタを変更するコードを生成することもできます。これがこの場合の動作です。

于 2012-07-02T04:11:07.723 に答える