Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 431
PSkocik Avatar asked Oct 05 '16 11:10

PSkocik


People also ask

What does the void *) 0 represent?

JavaScript void 0 means returning undefined (void) as a primitive value. You might come across the term “JavaScript:void(0)” while going through HTML documents. It is used to prevent any side effects caused while inserting an expression in a web page.

How to print void pointer address in C?

You can print a pointer value using printf with the %p format specifier. To do so, you should convert the pointer to type void * first using a cast (see below for void * pointers), although on machines that don't have different representations for different pointer types, this may not be necessary.


2 Answers

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).

like image 60
P.P Avatar answered Oct 22 '22 05:10

P.P


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

like image 11
MSalters Avatar answered Oct 22 '22 05:10

MSalters