web-dev-qa-db-ja.com

null終止符で終わる文字列リテラルには、余分なnull終止符が含まれていますか?

例えば:

_char a[] = "abc\0";
_

標準Cは、文字列の末尾にすでにゼロがある場合でも、値_0_の別のバイトを追加する必要があると言っていますか?それで、sizeof(a)は4または5に等しいですか?

44
xiaokaoy

すべての文字列リテラルには、文字列の内容に関係なく、暗黙のnullターミネーターがあります。

標準(6.4.5文字列リテラル)は次のように述べています。

文字列リテラルまたはリテラルから生じる各マルチバイト文字シーケンスに、値0のバイトまたはコードが追加されます。

したがって、文字列リテラル"abc\0"には、明示的なnullターミネータに加えて、暗黙的なnullターミネータが含まれています。したがって、配列aには5つの要素が含まれています。

68
David Heffernan