H. Peter Anvin wrote: > A Large Angry SCM wrote: >> Mark Wooding wrote: >> >>> Linus Torvalds <torvalds@osdl.org> wrote: >>> >>>> So in modern C, using NULL at the end of a varargs array as a >>>> pointer is perfectly sane, and the extra cast is just ugly and >>>> bowing to bad programming practices and makes no sense to anybody >>>> who never saw the horror that is K&R. >>> >>> No! You can still get bitten. You're lucky that on common platforms >>> all pointers look the same, but if you find one where `char *' (and >>> hence `void *') isn't the same as `struct foo *' then, under appropriate >>> circumstances you /will/ unless you put the casts in. >> >> Please explain how malloc() can work on such a platform. My reading of >> the '89 ANSI C spec. finds that _ALL_ (non function) pointers _are_ >> cast-able to/from a void * and that NULL should be #defined as (void >> *). See 3.2.2.3 and 4.1.5 if interested. > > Consider the non-hypothetical example of a word-addressed machine, which > has to have extra bits in a subword pointer like char *. The C standard > requires that void * has those bits as well, but it doesn't means that > any void * can be cast to any arbitrary pointer -- the opposite, > however, is required. ANSI X3.159-1989 3.2.2.3 Pointers A pointer to *void* may be converted to or from a pointer to any incomplete or object type. A pointer to any incomplete or object type may be converted to a pointer to *void* and back again; the result shall compare equal to the original pointer. For any qualifier /q/, a pointer to a non-/q/-qualified type may be converted to a pointer to the /q/-qualified version of the type; the values stored in the original and converted pointers shall compare equal. In integral constant expression with value 0, or such an expression cast to type <bold>void *</bold>, is called a /null pointer constant.[*33*] If a null pointer constant is assigned to or compared for equality to a pointer, the constant is converted to a pointer of that type. Such a pointer, called a /null pointer/, is guaranteed to compare unequal to a pointer to any object or function. Two null pointers, converted through possibly different sequences of casts to pointer types, shall compare equal. [*33*] the macro *NULL* is defined in <stddef.h> as a null pointer constant; see 4.1.5. - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.htmlReceived on Mon Mar 13 15:36:40 2006
This archive was generated by hypermail 2.1.8 : 2006-03-13 15:36:52 EST