Спецификатор формата %s
используется для вывода строк, представляющих собой последовательности символов, оканчивающиеся нулевыми символами.
Вы объявили массив, единственный (первый) элемент которого не содержит строки.
char ss[][3] = { "rty" };
Фактически массив объявлен следующим эквивалентным способом
char ss[][3] = { { 'r', 't', 'y' } };
, то есть конечный ноль строкового литерала, был исключен из списка инициализаторов, поскольку размер внутреннего массива равен только 3.
Для вывода массива вы можете написать
printf("%3.3s\n", ss[0]);
явно указав количество символов, которые вы собираетесь вывести.
Если вы хотите вывести его в виде строки, вы должны увеличить его как
char ss[][4] = { "rty" };
чтобы включить конечный ноль строкового литерала "rty"
.
В случае исходной программы кажется, что компилятор поместил в стек массивы в следующем порядке ss
, а затем s
. То есть память, выделенная для массивов, выглядит следующим образом.
{ 'r', 't', 'y', 'a', 'z', 'e', '\0' }
|___________| |_________________|
ss s
Обратите внимание, что это объявление
char s[] = "aze";
эквивалентно
char s[] = { 'a', 'z', 'e', '\0' };
, то есть строковый литерал включает в себя завершающий ноль, и, следовательно, массив s
будет содержать строку.
Также вы должны знать, что такое объявление
char ss[][3] = { "rty" };
не допускается в C ++. В C ++ вы должны написать по крайней мере, как
char ss[][4] = { "rty" };