1. ホーム
  2. c

[解決済み] 2次元配列全体を1つの値で初期化する

2023-02-01 03:55:18

質問

次のような宣言がある場合

int array[ROW][COLUMN]={0};

配列はすべて0になりますが、次のようなものが得られます。

int array[ROW][COLUMN]={1};

すべて1つの値の配列が得られません。デフォルト値は0のままです。

なぜこのような動作になるのでしょうか、また、どうすればオール1で初期化できるのでしょうか。

EDIT: 今、理解したのですが memset を使用すると、各バイトが 1 に設定されるため、配列の各セルの実際の値は 1 になりませんが 16843009 . どうすれば1になるのでしょうか?

どのように解決するのですか?

このような動作になるのは int array [ROW][COLUMN] = {1}; ではない というのは、「すべての項目を1つにする」という意味です。これがどのように機能するのか、順を追って説明しましょう。

配列を初期化する明示的でわかりやすい方法は、次のようになります。

#define ROW 2
#define COLUMN 2

int array [ROW][COLUMN] =
{
  {0, 0},
  {0, 0}
};

しかし、C言語では配列(または構造体/結合体)の中のいくつかの項目を省くことができます。例えば、次のように書くことができます。

int array [ROW][COLUMN] =
{
  {1, 2}
};

これは、最初の要素を1と2に初期化し、残りの要素を"あたかもそれらが静的な記憶期間を持つかのように"初期化することを意味します。C言語には、プログラマによって明示的に初期化されない静的記憶期間のすべてのオブジェクトは、ゼロに設定されなければならないというルールがあります。

したがって、上記の例では、最初の行は 1,2 に、次の行は 0,0 に設定されます。

次に、C言語には緩やかなブレーススタイルを許可するルールがあります。最初の例は次のように書くことができます。

int array [ROW][COLUMN] = {0, 0, 0, 0};

のように書くと、もちろんスタイルが悪いし、読みにくいし、理解しにくいのですが、このルールは便利です。しかし、このルールは便利です。

int array [ROW][COLUMN] = {0};

つまり、最初の行の最初の列を0に初期化し、他のすべての項目は静的な保存期間を持つかのように、つまり0に設定する、ということです。

したがって、もしあなたが

int array [ROW][COLUMN] = {1};

というのは、"最初の行の一番最初の列を1に初期化し、他のすべての項目を0に設定する"という意味です。