#include <iostream> using namespace std; int main() { char*a[]={"zzzz","zz","zzzzzzz"}; cout << sizeof(a) << endl; return 0; }
为什么输出是24呢?为什么数组的大小不是5 + 3 + 8 = 16呢?
24
5 + 3 + 8 = 16
欢迎选择我的课程,让我们一起见证您的进步~~
a は 3 つの文字列定数のアドレスを格納します。アドレスはポインタでもありません。
a
|----------| |xxxxxx| |----------| |----------| --> ポインタ 1 | |----------| |----------| | ポインタ 2 | ------------------------> |----------| |----------| | ポインタ 3 | |----------| |----------| | xxxxx | コード>
sizeof(a) == 3 * sizeof(ポインタ) = 24
32 ビットのオペレーティング システムを使用している場合、ポインタの長さは 4 バイト、64 ビットの場合は 8 バイトであるため、コンパイル環境は 64 ビットであると推測できます。
C/C++ 宣言は左から右に読み取ることができません。右に何もない場合は、カーソルを左に移動します。左側では、前のレベルに移動します。最初のステップが括弧に対して繰り返され、括弧がなくなると終了します。 [1]
つまり、char* a[] は次のことを意味します。
char* a[]
a は char へのポインタの配列です
文字列リテラルを使用して char* を初期化する場合、ポインタ変数はメモリ内の文字列定数のアドレスを格納します。
char*
つまり、
sizeof(a) == 3 * sizeof(char*)
64 ビット システムの場合、
sizeof(char*) == 8
それで
sizeof(a) == 24
さらに、C/C++ の配列のサイズは、常に配列内の 1 つの要素のサイズに配列内の要素の数を乗算したものと等しくなります。
これは、配列のサイズを計算するときは常に、複数の等しくない数値を加算しないことを意味します。
変数が占めるメモリ空間をその部分の合計と等しくしたい場合は、次のように記述できます。
#include int main() { 構造体 { 文字 a[5]; 文字 b[3]; char c[8]; a = {"zzzz", "zz", "zzzzzzzz"}; printf("%lu\n", sizeof(a)); // 16 = 5 + 3 + 8 }
a
は 3 つの文字列定数のアドレスを格納します。アドレスはポインタでもありません。32 ビットのオペレーティング システムを使用している場合、ポインタの長さは 4 バイト、64 ビットの場合は 8 バイトであるため、コンパイル環境は 64 ビットであると推測できます。
C/C++ 宣言は左から右に読み取ることができません。右に何もない場合は、カーソルを左に移動します。左側では、前のレベルに移動します。最初のステップが括弧に対して繰り返され、括弧がなくなると終了します。 [1]
つまり、
char* a[]
は次のことを意味します。文字列リテラルを使用して
char*
を初期化する場合、ポインタ変数はメモリ内の文字列定数のアドレスを格納します。つまり、
64 ビット システムの場合、
それで
さらに、C/C++ の配列のサイズは、常に配列内の 1 つの要素のサイズに配列内の要素の数を乗算したものと等しくなります。
これは、配列のサイズを計算するときは常に、複数の等しくない数値を加算しないことを意味します。
変数が占めるメモリ空間をその部分の合計と等しくしたい場合は、次のように記述できます。