楽しみのために複雑な例を見てみましょう。私たちが持っていると言う
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*)です。
それが役に立てば幸い!