Remix.run Logo
▲ randomNumber7 5 hours ago

> I do not get the connection with a VLA in this context

The article uses a struct with a VLA as the last element.

▲uecker 4 hours ago | parent [-]

I see. This array of unknown length at the end of a struct is called a flexible array member and not a variable length array (although it also refers to an array of variable length it is a different language feature).

▲lukasgelbmann 4 hours ago | parent | next [-]

Yes, and variable length arrays were made an optional part of the standard in C11. Whereas flexible array members remain a standard required feature.

Flexible array members don’t allocate a dynamic amount of memory on the stack.

▲uecker 4 hours ago | parent | next [-]

VLAs are supported by basically all modern C compilers though, and I do not think adding them was a mistake (I certainly use them a lot!). They got a bad reputation due to stack clash attacks, but in the past some compilers did not implement stack probing (clang was very late). But this was fixed a decade ago.

▲david2ndaccount an hour ago | parent [-]

Their specification is pretty bad, allowing code like:

    #include <stdio.h>
    #include <stddef.h>
    void v(int y[printf("hello world!\n")]){ 
    }

    int main(){
        v(NULL);
        typedef int wut[printf("oh no\n")];
    }
    $ cc vla.c && ./a.out
    hello world!
    oh no
`typedef`s with side effects...
▲ 4 hours ago | parent | prev [-]
[deleted]
▲randomNumber7 4 hours ago | parent | prev [-]

What happens when I put a variable of a struct type that contains a flexible array member on the stack?

▲uecker 3 hours ago | parent [-]

The array has size 0. In GNU C, you can initialize it and then it has a fixed size corresponding to the initializer.