str
として初期化された文字列のサイズchar str[]="S\032ABCD"
このヌル文字は、sizeof
演算子の結果にとって実際に何を意味しますか?
文字列リテラルのサイズは、文字数に終端の NUL バイトの 1 を加えたものです。あなたの場合sizeof "S\032ABCD"
は 7 です (\032 は 8 進数のエスケープ シーケンスであり、1 文字を表すため)。このリテラルは文字配列の配列初期化子として使用されるため、sizeof str
同様に 7 です。
C では、先頭に付いている数値はすべて0
8 進数と見なされます。したがって、 は032
全体として単一の文字と見なされます。したがって、sizeof
は 7 (6 文字 + NUL 終了の場合は 1) です。
8 進エスケープのみを削除する\
と、sizeof は 8 になります。
このsizeof
演算子は、型によって決定されるサイズをバイト単位で返します。
strlen
これは、文字列の長さを測定し、NUL ターミネータを検索する と混同しないでください。
sizeof
はあなたの NULL ターミネータを気にしません。あなたの配列を見て、「実際には、これはおそらく文字列なので、NUL ターミネータを探します」とは考えません。sizeof
さらに、コンパイル時に行うように、一般的なケースではこれを行うことはできません。