On Sun, Jul 14, 2019 at 10:30:27AM +0200, Johannes Sixt wrote: > Why would you re-order members? There's nothing wrong when a pointer is > initialized by 0. To appease tooling like "sparse" without having to remember to do anything specific at the point-of-use sites. I'm open to the idea that it is not worth appeasing sparse, but this may be a simple and practical compromise. > > But it does fall down > > when the first element _has_ to be a struct (like, say, any user of our > > hashmap.[ch] interface). > > No, it does not. It is not necessary to spell out nested structs in the > initializer. Ah, that is news to me. I know that this compiles OK with "gcc -Wall", but is it guaranteed by the standard? -- >8 -- #include <stdio.h> struct outer { struct { int x; char *y; } inner; }; int main(void) { struct outer foo = { 0 }; printf("%d %p\n", foo.inner.x, foo.inner.y); return 0; } -- 8< -- If so, then I agree that "0" is a pretty good solution, tooling like "sparse" aside. I do agree with your sentiment that "0" can be read as "please zero-initialize this struct" and not really as an attempt to set an initial member pointer to zero. -Peff