> Suppose you create a struct tm _without_ gmtime(3) or localtime(3), > using designated initializers or memset for zero-initialization, with > only what is included in POSIX:
> struct tm tm = { > .tm_sec = 56, > .tm_min = 34, > .tm_hour = 12, > .tm_mday = 1, > .tm_mon = 12 - 1, /* December */ > .tm_year = 2021 - 1900, > .tm_wday = 3, /* Wednesday */ > .tm_yday = 334, /* zero-based day of year (%j - 1) */ > .tm_isdst = 0, > }; This is fine. But using memset is not; if struct tm contains a pointer or a floating-point value, setting it to all-0-bits may produce a trap representation - or, possibly worse, a valid value that means something different from what you intend. Unless POSIX was stupid enough to mandate that all-bits-0 is nil for any pointer type and something well-defined for floating-point. (I'd be surprised by that, but standards bodies have surprised me often enough in the past.) Certainly C doesn't, at least not as of C99 - I don't have a copy of anything newer. /~\ The ASCII Mouse \ / Ribbon Campaign X Against HTML mo...@rodents-montreal.org / \ Email! 7D C8 61 52 5D E7 2D 39 4E F1 31 3E E8 B3 27 4B