kendall@wjh12.UUCP (Sam Kendall) (03/17/84)
I posted the following puzzle on 12/12/83:
For what, if any, subexpressions `p' do the expressions
*(p)
and
(p)[0]
not have identical meaning?
I received a grand total of two responses, by mail. One, from
Kenneth Almquist, was correct; the other concluded that there is no
such `p'.
I said that this wasn't a trick question, and I shouldn't have. The
answer is that for any `p' of type function or pointer to function,
`(p)[0]' doesn't have a meaning. It expands to `*((p) + 0)', but
pointer addition is illegal for function pointers, because pointer
addition needs to know the size of the pointed-to object, and functions
have no size.
Sam Kendall {allegra,ihnp4}!wjh12!kendall
Delft Consulting Corp. decvax!genrad!wjh12!kendallchris@umcp-cs.UUCP (03/18/84)
I'm quite possibly the one who said that there is no "p" for which
"(p)[0]" and "*p" were different, and you're right, pointer to
function makes the former illegal. I just tried giving it to
the 4.1BSD C compiler and it produces a "compiler error" no less!
I wonder if the System V PCC has the same bug (I consider it a bug
when your compiler announces an internal error for bad input).
--
In-Real-Life: Chris Torek, Univ of MD Comp Sci
UUCP: {seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet: chris@umcp-cs ARPA: chris.umcp-cs@CSNet-Relayeric@wucs.UUCP (03/22/84)
[Elrod of Melvinbone, and his trusty sword Linesucker...] The varargs(3) stuff is particularly sensitive to this horseydoodoo. Try passing a pointer to an integer function using varargs, and getting it with a line such as int (*funcs)(); ... funcs=va_arg(ap,int (*p)()); The 4.2 BSD (Bugs Surface Daily) compiler does the Technicolor Yawn on this one. The fix is FM as far as I can tell: typedef int (*pintf)(); pintf func; func=va_arg(ap,pintf); works just fine. As Bill the Cat would say, " GACK! ". eric -- ..!ihnp4!afinitc!wucs!eric