С printf , спецификатор преобразования s
[выделение добавлено] :
writes a character string
Аргумент должен быть указателем на начальный элемент массива символов. Точность определяет максимальное количество байтов для записи. Если Precision не указан, записывает каждый байт до и без первого нулевого терминатора . Если используется спецификатор l, аргумент должен быть указателем на начальный элемент массива wchar_t, который преобразуется в массив char, как будто при вызове wcrtomb с нулевым инициализированным состоянием преобразования.
В этом утверждении:
printf("%s %s", p, str);
p
- указатель на переменную типа char
c
, и вы используете спецификатор формата %s
. Обратите внимание, что если точность не указана с помощью спецификатора преобразования s
, то он записывает байты, пока не найдет нулевой завершающий символ. Спецификатор формата %s
, при записи байтов, указанных p
, будет записывать байты, начиная с памяти, указанной p
, пока не найдет нулевой завершающий символ. Это означает, что он может получить доступ к памяти за пределами памяти, принадлежащей объекту c
. Чтение памяти, которой не владеет программа, равно неопределенное поведение , которое включает в себя программу, которая может выполняться некорректно (либо аварийно завершать работу, либо генерировать неверные результаты в режиме без вывода сообщений), либо, к счастью, делать то, что задумал программист.
Вместо этого вы можете сделать:
printf("%.1s %s", p, str);
^^
precision of the conversion
С %.1s
он будет читать только один символ из ячейки памяти, указанной p
.