[net.lang.c] void * also malloc

sam@delftcc.UUCP (Sam Kendall) (04/25/86)

In article <200@brl-smoke.ARPA>, gwyn@BRL.ARPA writes:
> Malloc() should return (void *),
> which is a generic pointer type to/from which all other pointer types
> may be cast without loss of information.  (This is the only use of
> (void *), and it is the only universal pointer type; other pointer
> casts can be non-portable.)

Can anyone tell me when a `void *' could have a different representation
than a `char *'?  Since `sizeof (char)' is always 1 according to both
practical considerations and the draft standard, a char must be the
smallest addressable object.  Also according to practical considerations
(and the draft standard, I think) all objects consist of an integral
number of chars.  So there is nothing a `void *' can point at that a
`char *' cannot.

A `void *' and a `char *' could have different representations, although
I cannot think of a good reason.  But I think casts to `char *', and
from `char *' with proper alignment, are portable.  `void *', then,
is just a convenience for the human mind and for typecheckers.  That's
okay with me.

> Malloc() ALSO guarantees that the pointer
> it returns is suitably aligned for safe casting to ANY pointer type.
> This is a property of malloc(), not of (void *).

I've always wondered about something here: why is the return value of
malloc guaranteed to be aligned for any object, even one bigger than
the allocated area?  Currently, `malloc(1)' must return a maximally
aligned pointer!  This prevents an implementation which does something
space-efficient with small allocations.

----
Sam Kendall			{ ihnp4 | seismo!cmcl2 }!delftcc!sam
Delft Consulting Corp.		ARPA: delftcc!sam@NYU.ARPA