Это зависит. Я не думаю, что есть какое-то одно общее требование. Давайте рассмотрим два приведенных вами примера в контексте CreateProcess
.
lpStartupInfo
Этот параметр помечен аннотацией __in
. Это означает, что информация передается от вызывающей стороны к CreateProcess
. В этом случае вызывающая сторона несет ответственность за обеспечение надлежащей инициализации всех полей. Простой и распространенный способ сделать это - инициализировать всю структуру на ноль, а затем изменить только те поля, которые вы хотите отличать от нуля.
lpProcessInformation
Этот параметр помечен аннотацией __out
. Это означает, что информация передается из CreateProcess
вызывающей стороне. Любая инициализация, которую вы выполняете перед вызовом, игнорируется. Контракт заключается в том, что CreateProcess
не будет читать содержимое передаваемой вами структуры, но будет полностью инициализировать эту структуру. В таких случаях я считаю, что бессмысленно инициализировать структуру до ее передачи в CreateProcess
.
.
Конечно, если CreateProcess
завершится неудачей, возвращаемые значения не определены, и вы не должны их читать. Но даже если вы инициализировали нулевую структуру информации о процессе перед вызовом, у вас нет гарантии, что CreateProcess
не будет частично записана в нее. В случае сбоя функции API вы просто не должны читать что-либо, возвращенное ею, если в документации не указано иное.
Резюме
В заключение я бы посоветовал вам инициализировать все входные значения, передаваемые функции, а не инициализировать выходные значения.