se...@seebs.net (Peter Seebach) writes: > In message <200901212258.n0lmwqx07...@f7.net>, Karl Berry writes: >>I am surprised. I thought 0 was supposed to be a valid null pointer in >>all contexts, without casting. > > 0 is a null pointer constant. In a context where the language anticipates > a pointer, a null pointer constant becomes a null pointer. This means that > it's normally safe to write 0 and expect the language to treat it as a null > pointer, but it's quite possible to create contexts in which it isn't: > > printf("%p\n", 0); > > This isn't guaranteed to work, because variable argument lists aren't > prototyped, so the compiler has no knowledge that it has to convert the 0 > into a null pointer. > > In other contexts, it's pretty much useless to cast 0s. Note that NULL could > be the same, or it could be already converted to (void *), so it depends on > the implementation whether: > > printf("%p\n", NULL); > > is legit. (Which means it's not portable...)
Indeed, and a quite realistic example of where this bug hits in practice is with the version-etc module where the final NULL needs to be explicitly casted to work properly on all systems, e.g.: version_etc (stdout, "gsasl", p, gsasl_check_version (NULL), "Simon Josefsson", (char *) NULL); /Simon