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


Groups > comp.lang.c > #101765

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

From Ben Bacarisse <ben.usenet@bsb.me.uk>
Newsgroups comp.lang.c
Subject Re: sizeof(x) / sizeof(x[0])
Date 2017-01-14 14:47 +0000
Organization A noiseless patient Spider
Message-ID <87o9z9n1ey.fsf@bsb.me.uk> (permalink)
References <1420cd8f-e5cb-4a8f-93e6-d80a8b050650@googlegroups.com>

Show all headers | View raw


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.

-- 
Ben.

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