Я знаю, что, чтобы правильно использовать printf()
, нам нужно дополнительно передать такое же количество значений в соответствии с тем, что определено в const char* format
, то есть %s/%f/%d...
.Различные проверки времени выполнения printf() для% s?
int printf(const char* format, ...);
Я просто заметил, что, хотя и не рекомендуется, он будет работать без каких-либо ошибок во время выполнения, если мы не будем проходить в любых значениях, как следующее (конечно, мы получим не-ожидаемые результаты) :
printf("%a"); // ok
printf("%c"); // ok
printf("%d"); // ok
printf("%e"); // ok
printf("%f"); // ok
printf("%g"); // ok
printf("%i"); // ok
printf("%o"); // ok
printf("%p"); // ok
printf("%u"); // ok
printf("%x"); // ok
Если это будет справедливо для всех форматов, я не буду чувствовать себя не удивлен, думая, что printf()
не делает никаких проверок во время выполнения. Странно то, что это даст ошибку во время выполнения для %s
(также кажется единственной).
printf("%s"); // run-time error: Access violation reading location
Еще более интересным является то, что, кажется, что это только во время выполнения проверок для первого или подряда %s
. Проверьте следующие примеры:
printf("%s%s", "xxx"); // run-time error: Access violation reading location
printf("%s%d%s", "xxx"); // ok
Итак, мой вопрос заключается в том, что:
- ли
printf()
проверки во время выполнения по-разному для%s
по сравнению с другими форматами? И почему? - Почему
printf()
только проверка времени на первый или следующий из%s
?
ps: Я тестировал его под VS2010, ОС: Win7x64.
Это действительно вопрос * C *, в этом вопросе нет ничего * C++ *. –
Читайте на [variadic functions] (https://en.wikipedia.org/wiki/Variadic_function). 'printf' - одна из таких функций. С переменными функциями вы не можете проверять время на наличие аргументов, поэтому вы должны полагаться на другой известный аргумент, например строку формата в случае 'printf'. Если вы, как программист, не можете дать ему правильный аргумент, он будет читать все, что есть в стеке. '% d' и другие печатать эти значения мусора. '% s' принимает это значение мусора в качестве указателя и разыгрывает его, что вызывает ошибку сегментации (нарушение прав доступа). – Shahbaz
Мне также интересно, не распечатывает ли fffs здесь? –