1 2 3 4 5 6 7 8 9 10 |
|
为什么输出是24
呢?为什么数组的大小不是5 + 3 + 8 = 16
呢?
巴扎黑2017-04-17 14:50:36
a
は 3 つの文字列定数のアドレスを格納します。アドレスはポインタでもありません。
1 2 3 4 5 6 7 8 9 10 |
|
1
<code>sizeof(a) == 3 * sizeof(ポインタ) = 24</code>
32 ビットのオペレーティング システムを使用している場合、ポインタの長さは 4 バイト、64 ビットの場合は 8 バイトであるため、コンパイル環境は 64 ビットであると推測できます。
返事0
大家讲道理2017-04-17 14:50:36
C/C++ 宣言は左から右に読み取ることができません。右に何もない場合は、カーソルを左に移動します。左側では、前のレベルに移動します。最初のステップが括弧に対して繰り返され、括弧がなくなると終了します。 [1]
つまり、char* a[]
は次のことを意味します。
1
<code
class
=
"nohighlight"
>a は char へのポインタの配列です</code>
文字列リテラルを使用して char*
を初期化する場合、ポインタ変数はメモリ内の文字列定数のアドレスを格納します。
つまり、
1
<code
class
=
"c"
>sizeof(a) == 3 * sizeof(char*)</code>
64 ビット システムの場合、
1
<code
class
=
"c"
>sizeof(char*) == 8</code>
それで
1
<code
class
=
"c"
>sizeof(a) == 24</code>
<時間>
さらに、C/C++ の配列のサイズは、常に配列内の 1 つの要素のサイズに配列内の要素の数を乗算したものと等しくなります。
これは、配列のサイズを計算するときは常に、複数の等しくない数値を加算しないことを意味します。
変数が占めるメモリ空間をその部分の合計と等しくしたい場合は、次のように記述できます。
1
2
3
4
5
6
7
8
9
10
11
12
<code
class
=
"C"
>#
include
<stdio.h>
int main() {
構造体 {
文字 a[5];
文字 b[3];
char c[8];
a = {
"zzzz"
,
"zz"
,
"zzzzzzzz"
};
printf(
"%lu\n"
, sizeof(a));
// 16 = 5 + 3 + 8
}
</stdio.h></code>
返事0
キャンセル