Taking addresses of constants

Chris Torek chris at mimsy.UUCP
Mon Jun 19 17:20:08 AEST 1989


In article <5537 at rpi.edu> entropy at pawl.rpi.edu (Math Student from Hell) writes:
>Consider the following code:
>
>static char foo[]="\0\0\0\0\0\0\0\0";
>...
>{
>auto char **x; /* 'foo' has type (char *), 
>                   so '&foo' will have type (char **) */

`foo' does not have type (char *).  Its type is (char [9]), or
`array 9 of char' in pseudo-English.  &foo is therefore illegal
in Classic C (K&R-1), and has type (char (*)[9]), `pointer to
array 9 of char', in New C (pANS, K&R-2).

>x = &foo;

This is illegal in both kinds of C: in Classic C, because &foo is
illegal, and in New C, because the types of x and &foo do not match.

>**x = 'w';
>}

What this does, if you add casts to sleaze it by the compiler, is
unpredictable.

>Now, this code should be illegal and fail to compile,

Right, but ...

>because 'foo' is a constant expression and so has no address.

wrong reason.  `foo' is an array and has an address; each element
of that array also has an address.

>or, if the compiler allows this, it ought to stick the value of 'foo'
>in some static area and then generate code that assigns the address
>of this area to 'x' at the appropriate time.

This is a reasonable interprtation, but not the one taken in the pANS.
Some compilers (VMS C) have an extension that allows `&' to be applied
to rvalues; the meaning of

	&(expression)

(where expression is not an rvalue) is essentially

	{ static appropriate_type unnamed_var;
	  unnamed_var = (expression);
	  return &unnamed_var; }

so that, for instance,

	int *p = &3;

generates code equivalent to

	int _fake = 3;
	int *p = &fake;

This extension is just that: an extension.  VMS C might only allow this
in function calls (though that would be stupid).

>The old IBM 370 C compiler ... does [something else].

If it does not at least give a warning, this is a bad implementation.

>And thus, when I execute **x = 'w';,  I get a segmentation violation.

That much is entirely appropriate.
-- 
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