12.2. Characteristics of Allocated Memory
A successful memory allocation call yields a pointer to the beginning of a memory block. "The beginning" means that the pointer's value is equal to the lowest byte address in the block. The allocated block is aligned so that any type of object can be stored at that address.
An allocated memory block stays reserved for your program until you explicitly release it by calling free( ) or realloc( ). In other words, the storage duration of the block extends from its allocation to its release, or to end of the program.
The arrangement of memory blocks allocated by successive calls to malloc( ), calloc( ), and/or realloc( ) is unspecified.
It is also unspecified whether a request for a block of size zero results in a null pointer or an ordinary pointer value. In any case, however, there is no way to use a pointer to a block of zero bytes, except perhaps as an argument to realloc( ) or free( ).