私はCコードを持っています:
char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
戻る
20 8
8 はどのように由来するのだろうかと思います、ありがとう!
私はCコードを持っています:
char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
戻る
20 8
8 はどのように由来するのだろうかと思います、ありがとう!
sizeof(s1)
メモリ内の配列のサイズです。あなたの場合、それぞれが 1 バイトである 20 文字は 20 に相当します。
sizeof(s)
ポインタのサイズです。異なるマシンでは、異なるサイズになる可能性があります。私の場合は4です。
マシンでさまざまな型のサイズをテストするには、 so のような変数の代わりに型を渡すだけですprintf("%zu %zu\n", sizeof(char*), sizeof(char[20]));
。
32ビットマシン4
でそれぞれ印刷されます。20
sizeof(char *)
はポインタのサイズなので、通常 32 ビット マシンでは 4、64 ビット マシンでは 8 です。
sizeof
一方、配列は配列のサイズを出力します。この場合、20*sizeof(char) = 20 です。
%zu
もう1つ、size_t
タイプイン形式に使用する必要がありprintf
ます。
printf("%zu %zu\n", sizeof(s1), sizeof(s));
この演算子はtypesizeof
のサイズを返します。のオペランドは、括弧で囲まれた型または式の名前のいずれかですが、いずれの場合も、サイズはオペランドの型のみから決定されます。sizeof
sizeof s1
したがって、 は 20 と厳密に同等であり、 20sizeof (char[20])
を返します。
sizeof s
と厳密に同等でsizeof (char*)
あり、へのポインターのサイズを返しますchar
(この場合は64 ビット)。
が指す C 文字列の長さが必要な場合はs
、 を使用できますstrlen(s)
。
8 はポインタ、アドレスのサイズです。64 ビット マシンでは 8 バイトです。
64 ビット コンピュータを使用している場合、メモリ アドレスは 64 ビットであるため、64 ビット (8 バイト x 1 バイトあたり 8 ビット) の数値を使用して、数値ポインタ変数 (char*) を表す必要があります。
つまり、 sizeof() は、ポインターに対しても標準変数に対しても同じように機能します。ポインターを使用する場合は、ターゲット プラットフォームを考慮する必要があります。