Я надеюсь, что вы получили ответ на свой вопрос, однако, только чтобы прояснить вещи немного больше, для %s
спецификатор формата в printf()
, в соответствии с C11
стандартного документа, глава §7.21.6.1,
s
Если нет модификатора длины l
, аргумент должен быть указателем на исходный элемент массива типа символа. Символами из массива являются , записанные до (но не включая) завершающий нулевой символ.
Это означает, что указатель аргумент поставляются для %s
, должен быть указателем на char
, имеющий null
, в конце концов, чтобы отметить конец из-массива. Таким образом, завершается нулем char
массива считаются струны в С.
Теперь, возвращаясь к вашему делу,
char arr[10] = "''''''''''";
у вас есть ровно 10 инициализатору к 10-элементного char
массиве. таким образом, нет места для нуль-termiantor. Когда вы используете sypplu базовый адрес этого массива в качестве аргумента для printf()
, который будет использоваться для %s
, printf()
не знает, где остановиться, чтобы читать за пределами выделенной памяти, которая в свою очередь вызывает undefined behaviour.
Решение:
Оставьте распределение размера компилятора, лучший подход.
char arr[] = "''''''''''";
или, по крайней мере, выделить достаточно памяти, так что нуль-termiantor может быть размещен.
char arr[11] = "''''''''''"; //10 elements + 1 null
Пожалуйста, сделайте то же самое для arr1
и arr2
также.
Вы, вероятно, не читали предупреждение о компиляторе о «избыточном элементе инициализатора» или что-то в этом роде. (подсказка: строки C заканчиваются на 0.) –