Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #101769
| Newsgroups | comp.lang.c |
|---|---|
| Date | 2017-01-14 07:17 -0800 |
| References | <1420cd8f-e5cb-4a8f-93e6-d80a8b050650@googlegroups.com> <87o9z9n1ey.fsf@bsb.me.uk> |
| Message-ID | <3b0be4f0-5ef5-47fb-abb3-e6b4da367cd0@googlegroups.com> (permalink) |
| Subject | Re: sizeof(x) / sizeof(x[0]) |
| From | Alla _ <modelling.data@gmail.com> |
On Saturday, January 14, 2017 at 5:47:59 PM UTC+3, Ben Bacarisse wrote:
> Alla _ <modelling.data@gmail.com> writes:
>
> > Please, read my explanation before answering, to show
> > my mistake.
> > Honestly, for some time now I was sure I have no problems
> > with the statement sizeof(x) / sizeof(x[0]),
>
> Small point: the brackets are in the wrong place. It is usual in macros
> to put the parameter name in parentheses to prevent any possible
> interaction with the surrounding symbols. The classic example being
>
> #define square(x) x*x
>
> which goes wrong when used like this:
>
> square(a+1) => a+1*a+1
>
> Similarly, one should put the whole expression in parentheses:
>
> #define square(x) ((x)*(x))
>
> Because of the high priority of the sizeof and [] operators, it is
> likely that your expression will be fine, but the bets advice is to put
> the parentheses in every time just to stop people wondering if it really
> is OK or not:
>
> #define ARRAY_SIZE(a) (sizeof (a) / sizeof (a)[0])
>
> > usually used as
> > the macro to compute the size of an array of strings. I was
> > positive that I know how it works, and didn't doubt.
> > Somehow today when I used this macro again I've experienced
> > a confusion - how does it work, and what have I completely
> > forgotten? Although shameful, I have decided to come here again
> > for help on this matter.
> >
> > For example:
> > char *array[] = {"abc", "defg", "hijklmop", NULL};
> > The pointer points to an array that has 4 strings.
>
> The array has four pointers. These pointers point to the start of
> strings.
>
> > sizeof(x) here will be sizeof(array) thus indicating
> > the size in bytes of the whole array of strings,
>
> It will be the size of the whole array of pointers: 4 times however many
> bytes are in a char * on your machine (8 I think you once said).
>
> > because 'array' here is used as the address of the
> > first sub-element, which is 'a' (array is the same as
> > array[0][0]);
>
> No. 'array' in most contexts converts to a pointer to the first element
> of that array -- i.e. it will have type char **. array is the same as
> &array[0] (again in most contexts) and that is very much not the same as
> array[0][0].
>
> But remember, sizeof is one of the contexts where this conversion does
> not occur. sizeof array gives the number of byte on the object called
> array, even though in other contexts the expression array is converted
> to a pointer.
>
> > so sizeof(array) will give the number of bytes occupied
> > by the whole array of strings, i.e. number
> > of characters x 1 (which is the size of a char);
>
> No, it gives the size of the the whole array of pointers because that's
> what array is -- an array of pointers.
>
> > the denominator sizeof(x[0]) gives the size of the
> > first element of the array, i.e. the size of the first
> > string, which is here "abc", so it it is 3 (3 characters,
> > each 1 byte);
>
> No. sizeof(array[0]) is the size of one of the pointers.
>
> > and all other strings have different
> > number of characters in them, and hence different
> > number of bytes;
> >
> > how then sizeof(x) / sizeof(x[0]) gives a correct number
> > of strings in the array (it actually does, I have tested it
> > on different strings)? Please, show me my mistake.
>
> It gives you the number of elements in the array so, yes, your tests
> will work.
Thank you very much for this explanation. Of course! I see.
How could I forget this.
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
sizeof(x) / sizeof(x[0]) Alla _ <modelling.data@gmail.com> - 2017-01-14 04:16 -0800
Re: sizeof(x) / sizeof(x[0]) "Fernando D. Bozzo" <fdbozzo@gmail.com> - 2017-01-14 04:27 -0800
Re: sizeof(x) / sizeof(x[0]) Alla _ <modelling.data@gmail.com> - 2017-01-14 04:43 -0800
Re: sizeof(x) / sizeof(x[0]) "Fernando D. Bozzo" <fdbozzo@gmail.com> - 2017-01-14 04:52 -0800
Re: sizeof(x) / sizeof(x[0]) Alla _ <modelling.data@gmail.com> - 2017-01-14 06:10 -0800
Re: sizeof(x) / sizeof(x[0]) Keith Thompson <kst-u@mib.org> - 2017-01-14 15:55 -0800
Re: sizeof(x) / sizeof(x[0]) jt@toerring.de (Jens Thoms Toerring) - 2017-01-14 13:13 +0000
Re: sizeof(x) / sizeof(x[0]) Alla _ <modelling.data@gmail.com> - 2017-01-15 22:23 -0800
Re: sizeof(x) / sizeof(x[0]) Keith Thompson <kst-u@mib.org> - 2017-01-16 08:58 -0800
Re: sizeof(x) / sizeof(x[0]) Ben Bacarisse <ben.usenet@bsb.me.uk> - 2017-01-14 14:47 +0000
Re: sizeof(x) / sizeof(x[0]) Alla _ <modelling.data@gmail.com> - 2017-01-14 07:17 -0800
Re: sizeof(x) / sizeof(x[0]) Manfred <noname@invalid.add> - 2017-01-14 16:22 +0100
Re: sizeof(x) / sizeof(x[0]) Barry Schwarz <schwarzb@dqel.com> - 2017-01-14 08:35 -0800
Re: sizeof(x) / sizeof(x[0]) Alla _ <modelling.data@gmail.com> - 2017-01-15 22:53 -0800
Re: sizeof(x) / sizeof(x[0]) Ben Bacarisse <ben.usenet@bsb.me.uk> - 2017-01-16 15:58 +0000
Re: sizeof(x) / sizeof(x[0]) Alla _ <modelling.data@gmail.com> - 2017-01-16 22:38 -0800
Re: sizeof(x) / sizeof(x[0]) Ben Bacarisse <ben.usenet@bsb.me.uk> - 2017-01-17 10:11 +0000
Re: sizeof(x) / sizeof(x[0]) James Kuyper <jameskuyper@verizon.net> - 2017-01-14 11:43 -0500
Re: sizeof(x) / sizeof(x[0]) Keith Thompson <kst-u@mib.org> - 2017-01-14 16:01 -0800
Re: sizeof(x) / sizeof(x[0]) Alla _ <modelling.data@gmail.com> - 2017-01-16 01:36 -0800
Re: sizeof(x) / sizeof(x[0]) Barry Schwarz <schwarzb@dqel.com> - 2017-01-16 09:47 -0800
Re: sizeof(x) / sizeof(x[0]) James Kuyper <jameskuyper@verizon.net> - 2017-01-16 21:12 -0500
Re: sizeof(x) / sizeof(x[0]) Alla _ <modelling.data@gmail.com> - 2017-01-16 22:29 -0800
Re: sizeof(x) / sizeof(x[0]) Les Cargill <lcargill99@comcast.com> - 2017-01-14 14:27 -0600
Re: sizeof(x) / sizeof(x[0]) Keith Thompson <kst-u@mib.org> - 2017-01-14 15:52 -0800
Re: sizeof(x) / sizeof(x[0]) Lőrinczy Zsigmond <nospam@for.me> - 2017-01-15 20:20 +0100
Re: sizeof(x) / sizeof(x[0]) Keith Thompson <kst-u@mib.org> - 2017-01-15 12:55 -0800
csiph-web