Groups | Search | Server Info | Keyboard shortcuts | Login | Register


Groups > comp.lang.c.moderated > #464

Re: Portable/strictly conforming alternative to the "struct hack" (?)

From Jasen Betts <jasen@xnet.co.nz>
Newsgroups comp.lang.c.moderated
Subject Re: Portable/strictly conforming alternative to the "struct hack" (?)
Date 2013-09-06 23:24 -0500
Organization JJ's own news server
Message-ID <clcm-20130906-0001@plethora.net> (permalink)
References <clcm-20130902-0003@plethora.net>

Show all headers | View raw


On 2013-09-02, Árpád Goretity <arpad.goretity@gmail.com> wrote:
> I believe I've found a way to achieve something like the well-known "struct hack". I'm curoius if this strictly conforms to C89/C90 (I'm writing a library and my goal is full, strict C89/C90 conformance.)
>
> The main idea is: I allocate memory large enough to hold an initial struct and the elements of the array. The exact size is (K + N) * sizeof(array_base_type), where `K` is  large enough so that `K * sizeof(array_base_type) >= sizeof(the_struct)`, and `N` is the number of array elements.
>
> Then, I use the pointer that `malloc()` returned to store `the_struct`, then I use pointer arithmetic to obtain a pointer to the beginning of an array of `N` elements of the array following the struct.
>
> One line of code is worth more than a thousand words, so here is an implementation:
>
>     typedef struct Header {
>         size_t length;
>         /* other members follow */
>     } Header;

strange....

>     typedef struct Value {
>         int type;
>         union {
>             int intval;
>             double fltval;
>         } v;
>     } Value;
>
>     /* round up to nearest multiple of sizeof(Value) so that a Header struct fits in */

>     size_t n_hdr = (sizeof(Header) + sizeof(Value) - 1) / sizeof(Value);

that n_hdr expression looks kind of dodgy, basically it evaluates to 1, 
anyone who goes to such lengths to caclulate 1 is unlikley to have
discovered something special. After that  I stopped trying to understand 
your code

> So, is this approach any better than the classic struct hack (which has been officially deemed UB), or is it UB too?

Look at modern C compilers ...
this has been perfectly valid, well-behaved C since the 1999 standard:

struct clump {
    int      thing ;
    sometype data[];
	}

-- ⚂⚃ 100% natural

--- news://freenews.netfront.net/ - complaints: news@netfront.net ---
-- 
comp.lang.c.moderated - moderation address: clcm@plethora.net -- you must
have an appropriate newsgroups line in your header for your mail to be seen,
or the newsgroup name in square brackets in the subject line.  Sorry.

Back to comp.lang.c.moderated | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Portable/strictly conforming alternative to the "struct hack" (?) Árpád Goretity <arpad.goretity@gmail.com> - 2013-09-02 04:08 -0500
  Re: Portable/strictly conforming alternative to the "struct hack" (?) Jasen Betts <jasen@xnet.co.nz> - 2013-09-06 23:24 -0500
    Re: Portable/strictly conforming alternative to the "struct hack" (?) Jasen Betts <jasen@xnet.co.nz> - 2013-09-11 17:26 -0500
      Re: Portable/strictly conforming alternative to the "struct hack" (?) Árpád Goretity <arpad.goretity@gmail.com> - 2013-10-03 13:37 -0500
        Re: Portable/strictly conforming alternative to the "struct hack" (?) Keith Thompson <kst-u@mib.org> - 2013-10-08 16:38 -0500

csiph-web