peter.kourzanov@xxxxxxxxx wrote: > On Wed, Apr 09, 2008 at 06:34:05PM +0100, Andrew Haley wrote: >> But it's *not* always easily accessible. In this case, >> >> int bar(int p[n]) > > Well, n must be referring a symbol that is in scope, so > it must be bound to a value at run-time. Otherwise, if its undefined, > the sizeof should also be undefined... > >> n is somewhere in global scope, maybe in another translation unit, >> and as I point out below you'd have to copy it at the time the array >> was created. > > What's wrong with taking a snapshot of "n" when the function is > entered? After all, that's what p[n] specifies in the signature? I was trying to find out if you were serious. >> So, you're saying it *should* create a hidden copy of the size >> parameter for use by sizeof? While this would work, it's not very >> C. > > Hhm, not strictly following C99 standard, sure, but following common > sense, yes. That's what seems to be happening in this valid C99 > snippet: > > int main() { > int s=10,a[s]; > s=11; > assert(sizeof a == 40); > } Mmm, yes. > I do understand that our idle rumblings will not change the C99 > standard, but, frankly speaking, its very disappointing having to > write things such as: > > void foo(int s,int a[s]) > { > /* work-around the C99 always returning > * sizeof(int*) instead of s*sizeof(int) > */ > int _a[s]; > s=11; > for (int i=0; i<sizeof _a/sizeof _a[0]; i++); > } > > This one also generates slightly less optimal code... > > Maybe it's a good canditate for a GCC extension? I'm not sure how. C99 says "6.7.5.3 Function declarators (including prototypes) ... A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation." Andrew.