Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #101779
| From | Barry Schwarz <schwarzb@dqel.com> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: sizeof(x) / sizeof(x[0]) |
| Date | 2017-01-14 08:35 -0800 |
| Organization | A noiseless patient Spider |
| Message-ID | <tmjk7cppga86gcc0022rvsrb8c84au0e0n@4ax.com> (permalink) |
| References | <1420cd8f-e5cb-4a8f-93e6-d80a8b050650@googlegroups.com> |
On Sat, 14 Jan 2017 04:16:30 -0800 (PST), Alla _
<modelling.data@gmail.com> wrote:
<snip>
>For example:
>char *array[] = {"abc", "defg", "hijklmop", NULL};
>The pointer points to an array that has 4 strings.
There is not "the pointer". There is only one named object. That
object is "the array" whose name is "array". The array consists of 4
elements. None of the elements is a string. All the elements are
pointers, pointers to char to be precise. Three of those elements are
in fact initialized to point to a string ( a different string for each
one). The fourth element is initialized to indicate it points
nowhere.
>sizeof(x) here will be sizeof(array) thus indicating
>the size in bytes of the whole array of strings,
There is no array of strings, only an array of pointers.
>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! The sizeof operator is an exception to the rule that an array
name is converted to a pointer to the first element.
In the non-exceptional case, the conversion would be equivalent to
&array[0] which would be the address of (not the address contained in)
the first pointer. The byte (not char) at that address would be
either the high order or low order byte of the address contained in
the pointer and most likely would not correspond to any printable
character. &array[0] would not point to the 'a' in "abc".
>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);
It will give the number of bytes occupied by the array of pointers
which is completely independent of the length of the strings. Replace
"abc" in your initialization with
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" and
sizeof(array) yields the same value as yours. It will never count
characters.
>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); and all other strings have different
>number of characters in them, and hence different
>number of bytes;
No, it gives the size of the pointer.
>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.
You do not have an array of strings. You have an array of pointers.
Except for the last, each of the pointers points to another array (of
char). The pointers are independent and in this case each points to a
different array. Those arrays have different sizes. The pointers
themselves are all the same size.
--
Remove del for email
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