Why are dynamically-sized arrays implemented as malloc()?

I'm working on a project that should not use a Heap. In the process of revising my code for this, I've discovered that dynamically-sized arrays, e.g.

uint8_t my_array[MIN(input_size, MAX_SIZE)];

are automatically compiling into usages of malloc(). I've completed my code revision, but I have two questions:
Where is this behavior is documented?
Is it possible to change this so that the allocations instead happen on the Stack?

More questions in this forum