NULL isn't necessary a zero value. For instance, on AMD64 architecture, a null pointer is 0x7fff00000000. Usually things works automagically as the compiler always cast NULL and 0 in void * if stored in a pointer variable. But with functions with variable number of arguments the compiler can't know the type of the arguments and thus don't make the cast. In consequences, NULL and 0 must be cast explicitely in void * if the parameter is a pointer.