Pascal said:
void* p=malloc(0);
void* q=malloc(0);
assert((p!=NULL) and (q!=NULL) and (p!=q));
If C can do it with malloc, why C++ couldn't do it with classes and
new?
This is explicitly covered in C. From standard (recent draft):
7.20.3 Memory management functions
1 The order and contiguity of storage allocated by successive calls to
the calloc, malloc, and realloc functions is unspecified. The pointer
returned if the allocation succeeds is suitably aligned so that it may
be assigned to a pointer to any type of object and then used to access
such an object or an array of such objects in the space allocated
(until the space is explicitly deallocated). The lifetime of an
allocated object extends from the allocation until the deallocation.
Each such allocation shall yield a pointer to an object disjoint from
any other object. The pointer returned points to the start (lowest byte
address) of the allocated space. If the space cannot be allocated, a
null pointer is returned. If the size of the space requested is zero,
the behavior is implementationdefined: either a null pointer is
returned, or the behavior is as if the size were some nonzero value,
except that the returned pointer shall not be used to access an object.
So, a call to malloc(0) might return a null pointer, or it might not,
depending on your implementation. The behavior you see is one possible
result. When it does return a non-null pointer, you can't dereference
it, but it must be unique. You don't really have objects at those
pointers you got. The only thing you can do is compare the pointers or
pass them to realloc() or free().
Empty structs are illegal in C, so this concern doesn't come up in that
language at all. You don't have the same thing going on.
Brian