Petr Skocik
Petr Skocik

Reputation: 60127

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*,...)?

Upvotes: 24

Views: 1566

Answers (2)

P.P
P.P

Reputation: 121417

C11, §6.2.5, ¶28 (draft N1570) says:

A pointer to void shall have the same representation and alignment requirements as a pointer to a character type. 48) Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements.

(emphasis mine).

Upvotes: 36

MSalters
MSalters

Reputation: 180145

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

Upvotes: 11

Related Questions