Just to be clear: I do know that malloc and free are implemented in the C library, which usually allocates chunks of memory from the OS and does it         
        
C may not be as "abstract" as C++, but it's still intended to be an abstraction over assembly. To that end, the lowest-level details are taken out of the equation. This prevents you from having to furtle about with alignment and padding, for the most part, which would make all your C programs non-portable.
In short, this is the entire point of writing an abstraction.