A cast pointer is NOT an lvalue!? (ANSI C)

Chris Torek chris at mimsy.UUCP
Sun Oct 9 00:03:12 AEST 1988


In article <479 at midgard.mn.org> dal at midgard.mn.org (Dale Schumacher) writes:
>   value = *((long *) argp)++;
>
>The original 'argp' is typed as a int pointer.  Since I'm working closely
>with the compiler authors, I was able to talk to them about the compiler
>not handling this construct and was told that the X3J11 proposal states
>clearly (in a footnote) that the result of a pointer cast is NOT an lvalue!
>It appears to late to get this changed in the standard, but I would like
>to know WHY.

Because a cast changes the format of the pointer.  What do you expect
`int i; ((float)i)++;' to do?  It is true that on a Vax or a Sun,
casting one pointer type to another does not in fact alter the bits.
But on a Data General MV/10000 series machine, or on some Lisp machines,
it *does*, and the new type and value appears only in a register.
The register is discarded immediately after the expression, so
incrementing it is useless.

In other words, while a pointer cast is *implemented* as a pun on
many machines, it is in principle a true conversion, and the result
is as ephemeral as the result of any other conversion.

>As a clearer example of what I consider valid use of a cast
>pointer, consider the following:

But this *is* valid:

>    struct big_thing { /* several elements */ } big, *bp;
>    char *p;
[...]
>    if(p = malloc(sizeof(struct big_thing)))
>        *((struct big_thing *) p) = big;
>
>...  Why do I need to assign the cast value to an intermediate in
>order to dereference it and assign something to it's contents?

You do not.  The result of a cast is NEVER an rvalue, but the result of
an indirection *is* an lvalue.  The following is legal, although the
results on a Data General are that the pointer is trashed, and the
results on most machines is that the integer is trashed:

	int i; char *p;
	...
	(*(int **)&p)++;
	*(float *)&i += .1;

>It seems to me that the value of any cast to a pointer
>type should result in a modifyable lvalue, even if the expression being
>cast is not an lvalue, since you could cast thexpression to a pointer
>type, assign it to a pointer variable and then dereference it.

The result of an indirection is most assuredly not the same as
expression being indirected!  (Among other things, it has a different
type.)
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163)
Domain:	chris at mimsy.umd.edu	Path:	uunet!mimsy!chris



More information about the Comp.lang.c mailing list