Path: utzoo!utgpu!news-server.csri.toronto.edu!rutgers!gatech!udel!princeton!phoenix.Princeton.EDU!pfalstad From: pfalstad@phoenix.Princeton.EDU (Paul John Falstad) Newsgroups: comp.lang.c Subject: Re: sizeof() confusion Message-ID: <3830@idunno.Princeton.EDU> Date: 5 Nov 90 06:32:11 GMT References: <9156@latcs1.oz.au> Sender: news@idunno.Princeton.EDU Organization: Princeton University, Princeton, New Jersey Lines: 49 In article <9156@latcs1.oz.au> jacob@latcs1.oz.au (Jacob L. Cybulski) writes: >typedef unsigned char Pattern[8]; > >void foo (Pattern x) >{ >/* 0 */ printf("%d\n", sizeof(Pattern)); /* prints 8 */ >/* 1 */ printf("%d\n", sizeof(x)); /* prints 4 */ >/* 2 */ printf("%d\n", sizeof(*x)); /* prints 1 */ >/* 3 */ printf("%d\n", sizeof((Pattern) x); /* illegal */ >/* 4 */ printf("%d\n", sizeof(*((Pattern *) x))); /* prints 8 */ (I added some missing parens) >The intuition says that sizeof(Pattern) = sizeof(x) regardless of the >Pattern definition. This is true, if x is of type Pattern. It isn't in this case, although it looks like it. Well, not in C, if Pattern is an array then it is >implemented as a pointer so sizeof(x) is a pointer length (case 1), *x is an Not quite. Arrays used as function arguments are implemented as pointers. void foo (Pattern x) is equivalent to void foo (char *). >address of the first array element so it's length is that of its elements >(case 2), the cast of x into its type is illegal possibly because x is >implicitly defined as a (Pattern *) (case 3), finally a convoluted casting x is implicitly defined as a char *. You can't cast something to an array. >Now is it the fault of my compiler (THINK C) to give me such a hard time, >is it my bad C programming style, or is it the ANSI standard which has some >gaping semantic holes? The ANSI standard is giving you these results. I don't consider them gaping semantic holes. As long as you remember that whenever you pass an array as a function argument, a pointer is actually passed, the above all makes sense. To make it clear, you should probably declare foo as void foo(char x[]) or void foo (char *x). That style also emphasizes the fact that the called function just gets a pointer to the first element of the array, and therefore cannot possibly know the size of the array, so sizeof will not work. -- Paul Falstad, pfalstad@phoenix.princeton.edu PLink:HYPNOS GEnie:P.FALSTAD "Your attention, please. Would anyone who knows where the white courtesy phone is located please pick up the white courtesy phone."