[comp.lang.c++] pointer arithmitic on a void*

bobj@gli.com (Robert Jacobs) (09/07/90)

Is the following syntax allowable in c++. The reason I ask is because a version
of my compiler used to allow it but the UPGRADE forbids it.

int foo(void *p,int width)
{
	void *q;
	q = p+width;
}

The compiler complains about not knowing the size information.
In order to get this to work I have to recast p to either an int or a char*.

Note I am not trying to dereference a void. I know that is illegal.

If pointer arithmitic is not allowed on a void* then its usefullness is much
reduced.


Robert Jacobs
bobj@gli.com

daniel@terra.ucsc.edu (Daniel Edelson) (09/11/90)

In article <1990Sep7.144048.2049@gli.com> bobj@gli.com (Robert Jacobs) writes:
>
>Is the following syntax allowable in c++. The reason I ask is because a version
>of my compiler used to allow it but the UPGRADE forbids it.
>
>int foo(void *p,int width)
>{
>	void *q;
>	q = p+width;
>}
>
>The compiler complains about not knowing the size information.
>In order to get this to work I have to recast p to either an int or a char*.

>Note I am not trying to dereference a void. I know that is illegal.
>If pointer arithmitic is not allowed on a void* then its usefullness is much 
>reduced.

>Robert Jacobs
>bobj@gli.com


Pointer arithmetic on void * is illegal. This does not
reduce the usefullness of the void * type because arithmetic 
on void * would mean ``add an unknown quantity to this pointer.''

According to the ARM section 5.7 additive operators can
only be applied to a pointer when the pointer points
to an array element. This is the only legal pointer
arithmetic. According to 8.2.4 an array may be
constructed from any built-in type except void. 
Therefore no pointer arithmetic with void* is legal.

This must be the case because there's no way a void* pointer could
be correctly incremented. At the raw machine level, what value
should the compiler add to the pointer value? If the pointer
pointed at an integer, p+1 would add sizeof(int) to the pointer.
If it pointed at a char then sizeof(char) would be added. In
general, because of how K&R first defined pointer arithmetic
the size of the referenced object must be known for a pointer
to be arithmetiked

Daniel Edelson               | Don't just garbage collect, recycle.
daniel@cis.ucsc.edu, or,     | 
...!sun!practic!peren!daniel |