Zero-length static array spec

FG via Digitalmars-d digitalmars-d at puremagic.com
Sat Feb 7 02:56:15 PST 2015


On 2015-02-07 at 00:42, David Nadlinger wrote:
> Imagine you have this in your program:
>
> ---
> void foo() {
>    int[0] a0;
>    int[0] a1;
>    ...
>    int[0] a99;
>
>    // Do something with them.
> }
> ---
>
> How do you choose the addresses for a0 through a99 so that they are distinct, but you don't end up allocating 100 bytes of stack memory?


Forgive my ignorance and perhaps not seeing the whole picture, but when I read this:

> A static array with a dimension of 0 is allowed, but no space is allocated for it. It's useful as the last member of a variable length struct...

i am convinced that a0, ..., a99 are not variables but rather *labels* and should point to *the same address* of whatever could be put in that place (with 1-byte alignment). I do not understand why would they ever point to different places. Wouldn't that make them useless when used in structs like the following one (or to access stack, like above)?

     struct Packet {
         int a, b, c, length;
         ubyte[0] data;
         ubyte[0] payload;  // just a superfluous alias to data
     }
     unittest {
         Packet p;
         assert(p.sizeof == 16);
         assert(&p + 1 == cast(void*) &p.data);
         assert(&p + 1 == cast(void*) &p.payload);
     }

As for passing it around, it doesn't make sense, it is like passing an argument of type void, so shouldn't be allowed. Only a pointer to a zero-length array or a specified element would be fine:

     foo(&p.data)    // fine, ubyte*
     bar(p.data[i])  // fine, ubyte (or memory violation)
     xxx(p.data)     // ERROR, makes no sense, shouldn't compile


More information about the Digitalmars-d mailing list