Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #101769

Re: sizeof(x) / sizeof(x[0])

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>

Show all headers | View raw


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


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