On Sun, Mar 12, 2006 at 11:20:27AM -0800, A Large Angry SCM wrote: > >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. I think Linus has cut to the heart of the discussion (that it's worth git maintainers' sanity not to worry about such problems). However, for pedantry's sake, this is how malloc works: A void pointer is guaranteed to be able to hold any type of pointer (either char * or struct foo * or whatever). The declaration of malloc indicates a return of void *. On a platform where it matters, the compiler generates code so that struct foo *bar = malloc(100); converts the void * pointer into the correct size (in the same way that assigning between differently sized integers works). This breaks down with variadic functions, which have no typing information. So doing this: execl("foo", "bar", my_struct_foo); doesn't give the compiler a chance to do the implicit cast and you get subtle breakage (in the same way that you would if you passed a long to a variadic function expecting a short). -Peff - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html