楽しみのために複雑な例を見てみましょう。私たちが持っていると言う
char a[10][20][30] = { };
のサイズにa
なりますsizeof(char) * 10 * 20 * 30
。so sizeof(a)
= 6000 ( C99 標準による)。a
(10) の配列 (20) の配列 (30) 文字の配列として見ることができます。今
a[0]
(20) 配列の (30) 文字の配列を与える 1 次元小さくなります
a[0][0]
(30)文字の配列が得られます
a[0][0][0]
キャラクターです。
これらすべての例0
では、それぞれの配列レベルの最初の要素にすぎません。
実行して配列の長さを見つけることはsizeof(a)/sizeof(a[0])
、上記のロジックに根ざしたトリックです。sizeof(a[0])
= 6000/600 sizeof(a) / sizeof(a[0])
= 10 で、最初の次元の長さを返します。より高い次元についても同様の計算を行うことができます。
あなたの質問では、ポインタ型を持っているので、各次元の長さで乗算される基本係数として使用char*
する必要があります。sizeof(char*)
ポインター型のサイズは、使用するマシン/アーキテクチャーの種類とコンパイラーによって異なります。
私たちはそれぞれ異なるマシンを持ち、それらで実行されるコンパイラも異なるため、説明のために共通のリファレンスが必要です。プログラムをオンライン コンパイラで実行すると、結果が得られ 40 / 8 = 5
ます。上で述べたように、プラットフォームとコンパイラに応じて、ポインター型のサイズは異なります。
コメントに書いたように、配列の型はchar* [5][2]
. と逆参照する[0]
と、1 つのレベルが削除されますchar* [2]
。したがってsizeof(var[0]) = sizeof(char* [2])
= 8、2 つの char ポインタのサイズが 8 であるとします。これsizeof(char*)
は、そのオンライン マシンでは 4 であることを意味します。これに基づいてsizeof(var)
= 4 * 5 * 2 = 40 となり、これが出力に表示されるため、最初の配列の長さは 5 になります。
glglgl で言及されているように、出力は少し異なります(おそらく、マシンまたはコンパイラのデータモデルは16ビットです)。コンパイラと組み合わせて実行しているマシンは、char ポインターのサイズとして2sizeof(char*) = 2
を与えるようです。あなたがそうするときvar[0]
、私たちは持っていchar* [2]
ます; そのサイズはsizeof(char*) * 2
= 2 * 2 = 4 です。同様にsizeof(var)
= 2 * 5 * 2 = 20 です。したがって20 / 4 = 5
、出力として得られます。
1次元の要素ごとに何ビットあるのか、つまり計算で知るにはどうすればよいですか?
char* [5][2]
最初の次元の各要素は typeでchar* [2]
あるため、サイズは2 * sizeof(char*)
です。
それが役に立てば幸い!