Comment by uecker

9 hours ago

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).

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.

  • 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.

    • 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...

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

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