> C's refusal to specify dynamic memory allocation in the language runtime
> (as opposed to, eventually, the standard library) 

This complaint overlooks one tenet of C: every operation in what you
call "language runtime" takes O(1) time. Dynamic memory allocation
is not such an operation.

Your hobbyhorse awakened one of mine.

malloc was in v7, before the C standard was written. The standard
spinelessly buckled to allow malloc(0) to return 0, as some 
implementations gratuitously did. I can't imagine that any program
ever actually wanted the feature. Now it's one more undefined
behavior that lurks in thousands of programs.

There are two arguments for malloc(0), Most importantly, it caters for
a limiting case for aggregates generated at runtime--an instance of
Kernighan's Law, "Do nothing gracefully". It also provides a way to 
create a distinctive pointer to impart some meta-information, e.g.
"TBD" or "end of subgroup", distinct from the null pointer, which
merely denotes absence.

Doug