PSkocik PSkocik - 2 months ago 6
C Question

Will a void* always have the same representation as a char*?

Will a

void*
always have the same representation as a
char*
?

Details:

I want to work with a variadic function that takes char*'s terminated by a
(char*)0
like so:

int variadic(char*, ...); //<-prototype
variadic("foo", "bar", (char*)0); //<- usage


I wanted to replace
(char*)0
with
NULL
, but judging from
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf's:


66) The macro NULL is defined in (and other headers) as a
null pointer constant; see 7.19.

3 An integer constant expression with the value 0, or such an
expression cast to type void *, is called a null pointer constant. 66)
If a null pointer constant is converted to a pointer type, the
resulting pointer, called a null pointer, is guaranteed to compare
unequal to a pointer to any object or function.


I can't, because in the
variadic
context, I absolutely need a
char*
and a plain
0
is unacceptable.

If I defined:

#define NIL (void*)0 /*<= never a plain 0*/


would it be legal for me to use it to terminate my
variadic(char*,...)
?

Answer

It's specifically allowed to access a void* argument using va_arg(args, char*) and vice versa, not just for the null pointer.

See also http://en.cppreference.com/w/cpp/utility/variadic/va_arg

Comments