3

今、var_num=sizeof(var)/sizeof(var[0]);私は自分のコードで調査して使用している方法で which を使用して最初の次元を数えることができますが、問題は、それがどのように機能するかわからないことです20 / 4 = 5。その 20 と 4 は由来であり、これらの値がsizeof(var)andによってどのように取得されたsizeof(var[0])のか、そのゼロは何を意味し、それは 1 次元または 2 次元を参照しているのですか?

#include <stdio.h>
#include <conio.h>
void main(){
char *var[][2]={
        {"var0-0","var0-1"},
        {"var1-0","var1-1"},
        {"var2-0","var2-1"},
        {"var3-0","var3-1"},
        {"var4-0","var4-1"},
        };
int var_num=sizeof(var)/sizeof(var[0]);
clrscr();
printf("%d / %d = %d",sizeof(var),sizeof(var[0]),var_num);
getch();
}
4

5 に答える 5

4

楽しみのために複雑な例を見てみましょう。私たちが持っていると言う

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*)です。

それが役に立てば幸い!

于 2013-10-24T13:30:18.623 に答える
2

20配列のサイズ (バイト単位) で、4は配列の単一要素のサイズ (バイト単位) です。配列には同じ型のすべての要素があり、したがって同じサイズであるため、そのサイズを単一の要素のサイズで割ることによってその長さを取得します。0 番目の要素を使用する必要はありません。他の要素も使用できます (そのようなインデックスを持つ要素が確実に存在する場合)。

于 2013-10-24T13:19:32.427 に答える
2

var[0]は 型char **なので、ポインタです。32 ビット システムでは、アドレスは 4 バイトなので、ポインタのサイズは 4 です。

sizeof(var)type の配列に 5 つの要素があるため、 は 20 ですchar **

于 2013-10-24T13:20:11.073 に答える
0

あなたの答えはとても役に立ちました。ビットが大きくても小さくても、値は比例したままで、使用するビットシステムに応じて、1次元の単一要素を異なる方法で読み取ることができるという結論に達しました。同じ値を取得します。

于 2013-10-24T15:00:38.597 に答える