17

私はCコードを持っています:

char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;

戻る

20 8

8 はどのように由来するのだろうかと思います、ありがとう!

4

5 に答える 5

22

sizeof(s1)メモリ内の配列のサイズです。あなたの場合、それぞれが 1 バイトである 20 文字は 20 に相当します。

sizeof(s)ポインタのサイズです。異なるマシンでは、異なるサイズになる可能性があります。私の場合は4です。

マシンでさまざまな型のサイズをテストするには、 so のような変数の代わりに型を渡すだけですprintf("%zu %zu\n", sizeof(char*), sizeof(char[20]));

32ビットマシン4でそれぞれ印刷されます。20

于 2013-06-25T13:09:17.243 に答える
14

sizeof(char *)はポインタのサイズなので、通常 32 ビット マシンでは 4、64 ビット マシンでは 8 です。

sizeof一方、配列は配列のサイズを出力します。この場合、20*sizeof(char) = 20 です。

%zuもう1つ、size_tタイプイン形式に使用する必要がありprintfます。

printf("%zu %zu\n", sizeof(s1), sizeof(s));
于 2013-06-25T13:09:09.360 に答える
8

この演算子はtypesizeofのサイズを返します。のオペランドは、括弧で囲まれた型またはの名前のいずれかですが、いずれの場合も、サイズはオペランドの型のみから決定されます。sizeof

sizeof s1したがって、 は 20 と厳密に同等であり、 20sizeof (char[20])を返します。

sizeof sと厳密に同等でsizeof (char*)あり、へのポインターのサイズを返しますchar(この場合は64 ビット)。

が指す C 文字列の長さが必要な場合はs、 を使用できますstrlen(s)

于 2013-06-25T13:10:00.317 に答える
5

8 はポインタ、アドレスのサイズです。64 ビット マシンでは 8 バイトです。

于 2013-06-25T13:09:00.953 に答える
1

64 ビット コンピュータを使用している場合、メモリ アドレスは 64 ビットであるため、64 ビット (8 バイト x 1 バイトあたり 8 ビット) の数値を使用して、数値ポインタ変数 (char*) を表す必要があります。

つまり、 sizeof() は、ポインターに対しても標準変数に対しても同じように機能します。ポインターを使用する場合は、ターゲット プラットフォームを考慮する必要があります。

于 2013-06-25T13:13:54.713 に答える