Последний байт в строке C - это нулевой терминатор, байт со значением 0
, также записанный как '\0'
.strArray
- это массив char
, инициализированный из строковой константы C, его размер точно соответствует размеру инициализатора, включая нулевой байт, следовательно, strArray[lastElem-1]
- это нулевой байт '\0'
.
ВыводНулевой байт с форматом printf
%c
должен работать нормально, нулевой байт записывается в stdout
, но возможно, что ваш терминал игнорирует такие байты и выдает выложенный вами вывод.Вы можете попытаться перенаправить вывод вашей программы в файл и проверить этот файл с помощью шестнадцатеричного редактора, чтобы увидеть, действительно ли он содержит нулевой байт перед новой строкой.
Я получаю такое же поведение на моем MacBook с ОС/ X:
chqrlie@mba1 ~/dev/stackoverflow > ./nullbyte
Jonsnow from Game of Thrones
Size of array is: 29
first array value: J
last array value:
last array value: s
Но вот двоичный дамп вывода программы:
chqrlie@mba1 ~/dev/stackoverflow > ./nullbyte | od -bc
0000000 112 157 156 163 156 157 167 040 146 162 157 155 040 107 141 155
J o n s n o w f r o m G a m
0000020 145 040 157 146 040 124 150 162 157 156 145 163 012 123 151 172
e o f T h r o n e s \n S i z
0000040 145 040 157 146 040 141 162 162 141 171 040 151 163 072 040 062
e o f a r r a y i s : 2
0000060 071 012 146 151 162 163 164 040 141 162 162 141 171 040 166 141
9 \n f i r s t a r r a y v a
0000100 154 165 145 072 040 112 040 012 154 141 163 164 040 141 162 162
l u e : J \n l a s t a r r
0000120 141 171 040 166 141 154 165 145 072 040 000 040 012 154 141 163
a y v a l u e : \0 \n l a s
0000140 164 040 141 162 162 141 171 040 166 141 154 165 145 072 040 163
t a r r a y v a l u e : s
0000160 040 012
\n
0000162
Как видите, в четвертой строке между пробелами присутствует нулевой байт.
Также обратите внимание, что в программе есть ошибка: %d
может не подходить для аргумента типа size_t
.Формат C99 %zu
, но для переносимости на системы с плохой поддержкой времени выполнения C99 я бы порекомендовал:
printf("Size of array is: %lu\n", (unsigned long)sizeof(strArray));