Если вы определите массив символов без завершающего \0
(называемого «нулевым терминатором»), то в вашей строке этот терминатор не будет. Вы бы сделали это так:
char strings[] = {'h', 'e', 'l', 'l', 'o'};
В этом случае компилятор никогда автоматически не вставляет нулевой терминатор. Тот факт, что ваш код останавливается после «+2», является совпадением; с таким же успехом его можно остановить на +50 или где-либо еще, в зависимости от того, что в вашей памяти стоит строка \ 0 после вашей строки.
Если вы определяете строку как:
char strings[] = "hello";
Тогда это действительно будет нулевым. Когда вы используете такие же кавычки в С, то, хотя вы не можете физически увидеть его в текстовом редакторе, в конце строки есть нулевой терминатор.
Существуют некоторые функции, связанные со строками Си, которые автоматически добавляют нулевой терминатор. Это не то, что делает компилятор, а часть самой спецификации функции. Например, strncat () , который объединяет одну строку в другую, добавляет нулевой терминатор в конце.
Однако, если одна из строк, которую вы используете, еще не имеет этого терминатора, тогда эта функция не будет знать, где заканчивается строка, и вы получите значения мусора (или ошибки сегментации.)