printf("%lu \n", sizeof(*"327"));
ポインターのサイズは64ビットシステムでは8バイトだといつも思っていましたが、この呼び出しは1を返し続けます。
_*
_を文字列リテラルの前に置くと、リテラルが逆参照されます(文字列リテラルは文字の配列であり、このコンテキストの最初の要素へのポインターに減衰するため)。声明
_printf("%zu \n", sizeof(*"327"));
_
に等しい
_printf("%zu \n", sizeof("327"[0]));
_
_"327"[0]
_は、文字列リテラル_"327"
_の最初の要素を提供します。これは、文字_'3'
_です。減衰後の_"327"
_の型は_char *
_であり、逆参照後はchar
型の値を与え、最終的にsizeof(char)
は_1
_になります。
ステートメント:
printf("%lu \n", sizeof(*"327"));
*
を使用すると文字列327
の最初の文字が逆参照されるため、実際にはchar
のサイズが出力されます。次のように変更します。
char* str = "327";
printf("%zu \n", sizeof(str));
ここでは、%zu
の代わりに%lu
を使用する必要があることに注意してください。これは、 size_t
値を出力している であるためです。
文字列リテラルは、文字の匿名の静的配列であり、最初の文字へのポインター、つまり_char *
_型のポインター値に減衰します。
結果として、_*"abc"
_のような式は_*someArrayOfCharName
_と同等であり、これは_*&firstCharInArray
_と同等であり、結果としてfirstCharInArray
になります。 sizeof(firstCharInArray)
はsizeof(char)
であり、これは_1
_です。
haccks による適切な回答。
また、間違った書式指定子を使用したため、コードの動作はundefinedです。
したがって、sizeof()
は%zu
を返し、%lu
はunsigned
であるため、size_t
の代わりにsize_t
を使用します。
C11標準:§7.21.6.1:パラグラフ9:
変換仕様が無効な場合、動作は未定義です。225)引数が対応する変換仕様の正しいタイプでない場合、動作は未定義です。