0
#include <stdio.h>

int main(void)
{

    int values[10];
    int index;

    values[0] = 197;
    values[2] = -100;
    values[5] = 350;
    values[3] = values[0]+values[5];
    values[9] = 
    values[5] / 10;
    --values[2];

    for (index = 0; index < 10; index++)
        printf ("values[%i] = %i\n", index, values[index]);

    return 0;
}

1、4、および 6-8 の割り当てられていない要素に値があるのはなぜですか? 値を割り当てませんでした。空のときに自動的に 0 を割り当てるにはどうすればよいですか?

4

4 に答える 4

6

それらを割り当てなかったので、それらの場所で既にメモリにあったごみを取得するだけです。

ゼロ初期化するには、次のようにします。

int values[10] = {0};

または、 を使用しますmemset

于 2013-01-02T00:24:53.380 に答える
4

C では、自動変数がゼロになることはありません。あなたが望むのは、それを避けるためにmemset()配列にすることです。0

于 2013-01-02T00:25:24.317 に答える
3

Oli Charlesworth の投稿が解決策を示していますが、もう少し「理由」を紹介させてください。このような未定義の値は、アプリケーション スタックに割り当てられた「自動」変数では非常に明白です。

オペレーティング システムはプログラムをロードする前にメモリをゼロにする傾向がありますが、main() は C プログラムが実際に開始される場所ではありません。実際の開始位置は、実装に依存する場所に埋もれており、 main() 内のコードが、プログラムの起動中の一連の関数呼び出しの最後の呼び出しになります。これらの初期の内部呼び出しはすべて、スタック内で落書きされ、混乱が残ります。

各関数呼び出しは以前の呼び出しから混乱を継承するため、新しい呼び出しのスタックに何が表示されるかは実際には不明です。スタックが十分に大きくなると、最終的に未使用のメモリにオペレーティング システムのゼロが見つかります。これは、より大きなプログラムでのデバッグに役立つ場合がありますが、コードはそのようなゼロに依存してはなりません。

スタックとヒープ (malloc() など) の両方のメモリは、不明な値の影響を受けます。

于 2013-01-02T01:36:31.987 に答える
3

C99 からは、必要なサブオブジェクトのみを初期化することもでき、残りは静的ストレージ期間 ( 0for int)を持つデータとして初期化されます。

int values[10] =
{
    [0] = 197,
    [2] = -100,
    [5] = 350,
    [3] = values[0] + values[5],
    [9] = values[5] / 10
};

より複雑な初期化は、この方法では不可能/不明確です。次のようなもの:

--values[2];

同じ要素にイニシャライザが複数ある場合、最後のイニシャライザのみが使用され、最初のイニシャライザは評価されず、初期化されていない値が減少するため、初期化では実行できません。C11 標準から:

初期化はイニシャライザ リストの順序で行われ、特定のサブオブジェクトに指定された各イニシャライザは、同じサブオブジェクトの以前にリストされたイニシャライザをオーバーライドします。 151)

151) オーバーライドされ、そのサブオブジェクトの初期化に使用されないサブオブジェクトの初期化子は、まったく評価されない可能性があります。

(脚注以上の価値があると思います...)

ただし、これは一例にすぎないと思います350 - 1。この場合は初期化できます。

于 2013-01-02T00:37:00.047 に答える