PCC, lint bug
Wayne Throop
throopw at rtp47.UUCP
Tue Sep 10 09:58:59 AEST 1985
> I'm disgusted at the number of 'wizards' who are confused.
> 'x' should best be though of as a pointer to array of two ints.
> int y[2][2][2]; /* y should best be thought of as a pointer to
> two dimentional array of ints ([2][2]) */
> int yp[][2][2] = y; /* is a proper pointer */
> Jeff Anton ucbvax!anton anton at BERKELEY.EDU
Now wait a minuite. As near as I can tell from this fragment, Jeff is
as confused as any other wizard. Since an initializer is used in the
declaration
int yp[][2][2] = y;
yp is clearly *not* a formal. And this being the case, *yp* *is* *not*
(I repeat *not*) a pointer. I assume what is meant to happen for the
two above declarations is
int y[2][2][2];
int (*yp)[2][2] = y;
The abomination Jeff gave above declares yp to be an array of 1
array of 2 array of 2 integers, and (if the compiler doesn't choke)
initializes yp[0][0][0] to be the expression (int)y. Yuck.
I tried this C file on SysV lint:
int x1[2][2];
int x2[][2] = x1; /* I hope lint complains here */
int (*x3)[2] = x1; /* I hope lint doesn't complain here */
And lint quite properly complained, saying:
warning: illegal combination of pointer and integer:
(2) operator =
It is interesting that pointer/array equivalence causes such problems,
when it it really so simple. The *only* (I repeat *only*) place where
a declarator like "int x[]" declares x to be a pointer is in *formal*
declarations. In static, external, or automatic declarations, *x* *is*
*an* *array* (of compiler or loader determined size). And even in
formal declarations, x "should be" *thought of* as an array.
--
Note that Followup-To specifies net.lang.c
--
"People who live in glass houses, shouldn't"
--
Wayne Throop at Data General, RTP, NC
<the-known-world>!mcnc!rti-sel!rtp47!throopw
More information about the Comp.unix.wizards
mailing list