Почему размер байта строки длиннее длины?

Почему это sizeof("Bill") есть 5, но sizeof(char) есть 1?

Не следует ли sizeof("Bill") быть 4, так как длина строки равна 4 символам (4 x 1)?

Я полагаю, что это может иметь отношение к "Bill", являющемуся массивом символов, но почему это увеличивает размер байта?

Ответ 1

Строки

C имеют нулевое завершение. В конце этой строки находится нулевой байт. Предполагая, что ASCII, "Bill" выглядит следующим образом:

'B'  'i'  'l'  'l'  '\0'
0x42 0x69 0x6c 0x6c 0x00

Из стандарта C раздел 6.4.5 Строковые литералы, пункт 7:

В фазе 7 перевода байт или код нулевого значения добавляется к каждой многобайтовой последовательности символов, которая получается из строкового литерала или литералов.

Если вы хотите получить ответ 4 для длины, вы должны использовать strlen("Bill"), а не sizeof.

Если вам действительно не нужен нулевой ограничитель, это тоже возможно, хотя, вероятно, не рекомендуется. Это определение:

char bill[4] = "Bill";

даст 4-байтовый массив bill, содержащий только символы 'B', 'i', 'l' и 'l', без нуль-терминатора.

Ответ 2

он имеет 0 как символ терминатора, поэтому его B i l l 0