Are left out fields by C++ 20 designated initialization guaranteed to be zero initialized?

Are the left out fields zero-intialized?

In this case, yes. The rule is (from [dcl.init]/5):

For a non-union aggregate, each element that is not an explicitly initialized element is initialized as follows:

  • If the element has a default member initializer ([class.mem]), the element is initialized from that initializer.
  • Otherwise, if the element is not a reference, the element is copy-initialized from an empty initializer list ([dcl.init.list]).
  • Otherwise, the program is ill-formed.

In this case p is not explicitly initialized. It has no default member initializer, so we fall to the second bullet. It is not a reference, so it is copy-initialized from {}. For a void*, that's zero-initialization.