Но как понять что в массиве символов work нет нуля, а в конце строки warm есть?
Путем чтения спецификации языка.
В конце строки
work нет нуля потому, что вы его не указали в инициализаторе. Не указали - вот его и нет. Обратите внимание, что если бы вы явно указали размер массива
work и сделали бы его побольше (например,
work[10]), то те элементы массива, которым не хватило инициализаторов, были бы автоматически обнулены. Таким образом в массиве
work появились бы замыкающие нули и при печати такого массива через
%s выводилось бы просто
sup. Но вы не указали размера массива
work вообще. В таком случае этот размер будет автоматически вычислен на основе количества указанных инициализаторов. Вы указали три инициализатора - значит размер массива будет равен 3 и никакого замыкающего нуля в нем не будет.
В то же время грамматическая конструкция
"skubidy" - это так называемый
строковый литерал, т.е. последовательность символов, которая, согласно спецификации языка, неявно включает в себя символ
'\0' в конце. То есть в объявлении массива
warm, указанный вами инициализатор уже включает в себя замыкающий ноль. Размер инициализатора
"skubidy" сам по себе равен 8 (попробуйте
sizeof "skubidy"). Поэтому и размер массива
warm, который вы тоже не указали, будет автоматически установлен равным 8 и этот массив будет проинициализирован всеми восемью символами строкового литерала
"skubidy", включая замыкающий ноль.
P.S. Одной из особенностей языка С (и отличием от С++) является то, что вы можете "потерять" замыкающий ноль при инициализации массива
warm, если явно укажете размер этого массива как 7.