does not return a non-NULL under every implementation.
An implementation is free to behave in a manner it finds
suitable, if the allocation size requested is zero. The
implmentation may choose any of the following actions:
* A null pointer is returned.
* The behavior is same as if a space of non-zero size
was requested. In this case, the usage of return
value yields to undefined-behavior.
Notice, however, that if the implementation returns a non-NULL
value for a request of a zero-length space, a pointer to object
of ZERO length is returned! Think, how an object of zero size
should be represented?
For implementations that return non-NULL values, a typical usage
is as follows:
func ( void )
int *p; /* p is a one-dimensional array,
whose size will vary during the
the lifetime of the program */
p = malloc(0); /* initial allocation */
perror (”FAILURE” );
/* … */
c = (size_t) … ; /* Calculate allocation size */
p = realloc ( p, c * sizeof *p );
/* use p, or break from the loop */
/* … */
Notice that this program is not portable, since an implementation
is free to return NULL for a malloc(0) request, as the C Standard
does not support zero-sized objects.