A question about sizeof

Rex Jaeschke rex at aussie.UUCP
Wed Oct 24 02:09:17 AEST 1990


> (Erkki Ruohtula) writes:
> The standard says that "sizeof something_of_array_type" gives the size of the
> array, not that of the pointer to the first element. But when does the
> "arrayness" disappear in the conversion to pointer? What should
> "sizeof (struct_pointer->field_of_array_type)" be? Do the parentheses affect
> the interpretation?

In C, an expression that designates an array is converted to a pointer 
to the first element except when it isn't. Very clear, right? Well, 
there are only 3 situations where the conversion DOES NOT take place. 
They are, when the array designating expression is the operand of 
sizeof or & (remember that ANSI C allows you to take the address of an 
lvalue array expression), and in a special case of initialization. 
An example of the latter case,

	char *pc = "abcd";

the expression "abcd" designates an array of 5 chars and this 
expression IS converted to a char *. However, in the case of

	char c[] = "abcd";

the `expression' "abcd" is treated as short-hand notation for {'a', 
'b', 'c', 'd', '\0'} and there is NO conversion.


In the case of sizeof (struct_pointer->field_of_array_type) the 
operand still has array type so there's no conversion. The parens 
are redundant and have no effect.

Now something not well understood is that conversions of arrays to 
pointers is ONLY defined for array expressions that ARE lvalues. The 
semantics when they are not lvalues is undefined. For example, given

struct tag {
	char c[5];
};

struct tag f(void);

what happens with f().c? f returns a struct by value and c is an array 
member of that structure. However, f() is NOT an lvalue which means 
that f().c is NOT an lvalue and so it is undefined as to what happens. 
Certainly you cannot rely on the array/pointer conversion. This is the 
only place I've been able to come up with an array expression having 
these properties. (g()->c is not a problem since g()->c can be an 
lvalue even if g() is not.)


In a related situation, given void f(void), what is sizeof(f)? I've 
had several compilers convert the function designating expression f to 
a pointer to function and therefore producing an answer. ANSI C, 
however, says (and K&R implies) this is incorrect and that there is no 
conversion done making the construct invalid. Why? Because sizeof can 
only be applied to objects having completed type and a function is not 
an object. Also, sizeof(f) is equivalent to sizeof(void (void)) and 
the latter clearly is erroneous.

Rex

----------------------------------------------------------------------------
Rex Jaeschke     |  Journal of C Language Translation  | C Users Journal
(703) 860-0091   |        2051 Swans Neck Way          | DEC PROFESSIONAL
uunet!aussie!rex |     Reston, Virginia 22091, USA     | Programmers Journal
----------------------------------------------------------------------------
Convener of the Numerical C Extensions Group (NCEG)
----------------------------------------------------------------------------



More information about the Comp.std.c mailing list