Path: csiph.com!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.c Subject: Re: Nice way of allocating flexible struct. Date: Thu, 09 Oct 2025 19:50:43 -0700 Organization: None to speak of Lines: 37 Message-ID: <87y0pjh3lo.fsf@example.invalid> References: <20251007233002.852@kylheku.com> <10c63rl$1n5qf$1@dont-email.me> <87347thx9h.fsf@example.invalid> <20251008183724.803@kylheku.com> <10c7a0v$24vls$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain Injection-Date: Fri, 10 Oct 2025 02:50:48 +0000 (UTC) Injection-Info: dont-email.me; posting-host="1482983652616b850c5f606e9d41c502"; logging-data="3912681"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19yde1FL0IE6/eL8Ammtn15" User-Agent: Gnus/5.13 (Gnus v5.13) Cancel-Lock: sha1:5d61DuOgQJwck0M3KlHiYcBRP+4= sha1:4iRUt3b2IKcPovClIaH81yOsk4Q= Xref: csiph.com comp.lang.c:394522 BGB writes: > On 10/8/2025 8:39 PM, Kaz Kylheku wrote: >> On 2025-10-08, Keith Thompson wrote: >>> But in addition to that, in Kaz's example, n is not a constant >>> expression, so `&(t.member-designator)` is not an address constant >>> and therefore `offsetof(S, A[n])` has undefined behavior. >> Great; I'd like to hear reasons to avoid it so I don't look foolish >> for having overlooked it for manytyears. :) >> >>> Every compiler I've tried handles this "correctly", and I tend to >> I'm sure I've seen foo.bar expressions on the right of an offsetof, >> but those still yield constants. >> > > I think it is a case of, it is not required to work... > > But, if the typical implementation is something like, say: > #define offsetof(T, M) ((long)(&(((T *)0)->M))) > > It is probably going to work without issue. The cast needs to be (size_t), not (long). With that change, the behavior is still undefined, but it's likely to work in most implementations, which is all that's required for code that's part of the implementation. Several implementations I've tried (gcc, clang, tcc) implement the offsetof macro via "__builtin_offsetof". Whatever compiler magic is used to implement "__builtin_offsetof" typically works correctly for Kaz's example (which is of course one of the possible results of undefined behavior). One other compiler I've tried has a #define similar to yours (and also gets the type wrong, but the author of that implementation is not interested in bug reports from me). -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com void Void(void) { Void(); } /* The recursive call of the void */