is this valid
void *p = &X; /* some thing */
p += 12;
and if so what does p now point to? I have (third party) code that does this (and compiles cleanly) and my guess is that the void * was treated as a char *. My trusty K&R is silent(ish) on the topic
EDIT: My little test app runs fine on gcc 4.1.1 and treats void * as char *. But g++ barfs
I know how to do it properly. I need to know if I have to clean this code base to find all the places its done.
BTW gcc -pedantic throws up a warning
Summary:
The C spec is ambiguous. It says that in terms of representation and use as function parameters void* =char*. But it is silent regarding pointer arithmetic.
- gcc (4) permits it and treats it as char *
- g++ refuses it
- gcc -pedantic warns about it
- vs2010 both c and c++ refuses it
You may want to have a look at the top voted answer for this question
Pointer arithmetic for void pointer in C
Your guess is correct.
In the standard ISO C99, section 6.2.5 paragraph 26, it declares that void pointers and character pointers will have the same representation and alignment requirements (paraphrasing).
It depends on compiler. Those that allow it consider sizeof(*(void *)) as 1.
EDIT: it's only for void pointer arithmetic. It would have no sense using in this case steps of sizeof(int) or of 0. The common expectations of someone who uses it would be the smallest possible step.
I don't think you can, because it doesn't know its type, therefore can not seek the correct amount of bytes.
Cast it to a type first, i.e.
(int)
.No this is not legal. A
void*
cannot be arbitrarily incremented. It needs to be cast to a specific type first.If you want to increment it by a specific number of bytes then this is the solution I use.
The
char
type is convenient because it has a defined size of 1 byte.EDIT
It's interesting that it runs on gcc with a warning. I tested on Visual Studio 2010 and verified it does not compile. My limited understanding of the standard would say that gcc in the error here. Can you add the following compilation flags
To quote from the spec:
A pointer to void is not a pointer to an object type, as per these excerpts:
Therefore, pointer arithmetic is not defined for pointer to void types.