4

int 要素の配列が C で宣言されているかどうかを知りたいのですが、配列の一部の値のみが 0 に割り当てられ、他の値がガベージ値を格納するパターンはありますか? 元:

#include <stdio.h>

void main()
{
    int a[5];
    int i;
    for (i=0;i<=4;i++)
    {
        printf("%d\n",a[i]);
    }
}

プログラムをコンパイルして実行すると、次の出力が得られます。

0
0
4195344
0
2107770384

したがって、ゼロがあり、コンパイルa[0], a[1]および実行されるたびに同じ値が含まれますが、a[3]値は変化し続けます (負の数を含む)。配列の一部の固定インデックスのみがゼロに初期化され、メモリ空間の過去の割り当てに関連するものがあるのはなぜですか?a[2]a[4]

4

4 に答える 4

8

この動作は定義されておらず、単なる偶然です。スタックで配列を宣言し、それを初期化しない場合、配列は別の (おそらく前の) スタック フレームから値を取得します。

余談:スタック上で宣言された配列を (一定時間で) ゼロで埋めたい場合は、次の初期化構文を使用して初期化できます。

int arr[ 5 ] = { 0 };

最初の要素を 0 として書き込み、残りの要素をゼロで埋めます。ただし、初期化されていない配列をグローバルに宣言すると、自動的にゼロで埋められます。

于 2013-08-09T20:50:50.970 に答える
1

ターミナルでコードを実行して、次のように言うと思います。

まず、実行する./a.outか、名前を付けた何かを実行します。

次に、端末プロセス (親プロセス)fork()が新しいプロセス (子プロセス) を作成するために呼び出します。現在、子プロセスは親プロセスと同じように見え、スタックメモリ内のすべてのデータと同様に、すべてが親からコピーされます。

3番目に、子プロセスはexce関数を呼び出してプログラムをロードしました。ただし、新しいプロセスは使用されていないメモリをすべてクリアしませんでした。親プロセスの一部が初期化されていなくても、親からコピーされた値を保持するだけです。したがって、int a[5];初期化せずに子プロセスで宣言すると、スタックから20のメモリサイズが割り当てられるだけで、OSはそれらのメモリがに属していることを知っていますa[5]が、の値はa[5]まだ不明です。それはすべての値である可能性があり、端末プロセスに依存している可能性があります。

そのため、できれば変数を宣言するときに変数を初期化するのは良い習慣です。

ただ使うint array = {0};

于 2013-08-10T15:30:08.133 に答える
1

C では、配列をそのように宣言すると、配列は初期化されません。それはすべてゴミデータです。ゼロがあるのは幸運です。

配列を 0 に初期化したい場合は、

memset(a,0,sizeof(a));

于 2013-08-09T20:45:09.167 に答える
1

これは未定義の動作であり、OS に依存します。割り当てられていない配列の初期値は未定義です。良い習慣として、それらに値を割り当てるのはあなたの責任です。

于 2013-08-09T20:45:35.147 に答える