Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #163477
| From | Manfred <noname@add.invalid> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: on why declare a struct with a single array in it |
| Date | 2021-11-18 18:04 +0100 |
| Organization | Aioe.org NNTP Server |
| Message-ID | <sn6134$i63$1@gioia.aioe.org> (permalink) |
| References | (3 earlier) <smmhhg$bfh$1@dont-email.me> <sn5pcl$pru$1@dont-email.me> <sn5qji$3ri$1@dont-email.me> <sn5rc0$1i81$1@gioia.aioe.org> <sn5ukn$2ir$1@dont-email.me> |
On 11/18/2021 5:22 PM, pozz wrote:
> Il 18/11/2021 16:26, Manfred ha scritto:
>> On 11/18/2021 4:13 PM, David Brown wrote:
>>> On 18/11/2021 15:53, pozz wrote:
>>>> Il 12/11/2021 21:07, David Brown ha scritto:
>>>>> On 12/11/2021 20:31, Ben Bacarisse wrote:
>>>>>> Guillaume <message@bottle.org> writes:
>>>>>>
>>>>>>> Le 12/11/2021 à 19:48, Meredith Montgomery a écrit :
>>>>>>>> Why would someone put a lonely array inside a structure?
>>>>>>>> struct ip_address { unsigned char d[4]; };
>>>>>>>> Would it be because they want to (in the future) add more
>>>>>>>> members to
>>>>>>>> this structure?
>>>>>>>
>>>>>>> That can be a good reason. Anticipating makes for much more
>>>>>>> maintainable code.
>>>>>>>
>>>>>>> But another reason here is that it's a way to make it possible to
>>>>>>> copy
>>>>>>> arrays. In C, you can't copy arrays.
>>>>>>>
>>>>>>> unsigned char d1[4], d2[4];
>>>>>>>
>>>>>>> d2 = d1; // invalid C
>>>>>>>
>>>>>>> You have to either copy item by item in a loop, or use memcpy() or
>>>>>>> something similar.
>>>>>>>
>>>>>>> If you encapsulate an array in a struct, now you can do it more
>>>>>>> elegantly:
>>>>>>>
>>>>>>> struct ip_address ip1, ip2;
>>>>>>>
>>>>>>> ip2 = ip1; // perfectly valid C, and will copy the whole array
>>>>>>
>>>>>> And a special case of copying is passing values to a function. That
>>>>>> might even be the /main/ reason for putting an array into a struct,
>>>>>> though only the code's author really knows.
>>>>>>
>>>>>
>>>>> That is certainly one reason why I do it. Basically, it means you
>>>>> have
>>>>> a "value" type that does not decay to a pointer. It also means the
>>>>> size
>>>>> is fixed and available via "sizeof" as it is passed around, and
>>>>> perhaps
>>>>> most importantly it is a specific type. The "struct ip_address"
>>>>> here is
>>>>> a named type that cannot be confused with any other array of unsigned
>>>>> char, nor a pointer to an unsigned char.
>>>>>
>>>>
>>>> Regarding your two last sentences, the same can be achieved with:
>>>>
>>>> typedef unsigned char ip_address[4];
>>>>
>>>> So I don't think those two last arguments are the real reason to
>>>> embed a
>>>> fixed-sized array into a struct.
>>>>
>>>
>>> No, it is not the same thing at all.
>>>
>>>
>>> Try compiling:
>>>
>>> typedef unsigned char ip_address[4];
>>> ip_address a;
>>> unsigned char * p = a;
>>>
>>> Since "a" is just an array of unsigned char, most uses of it in an
>>> expression decay to a pointer to the first element. "typedef", despite
>>> the name, does not define a type - it gives an alias to an existing
>>> type. If you want to make a new type so that pointers to it are
>>> incompatible with other pointer types, you need to put it in a struct
>>> (or a union, but that might seem a little odd). And wrapping it in a
>>> struct (or union) is the only way to stop this decay, so that the type
>>> retains its value and size even when passed into and out of functions.
>>>
>>
>> Even more:
>>
>>
>> $ cat ip_address_array_size.c
>> #include <stdio.h>
>>
>> typedef unsigned char ip_address[4];
>>
>> void foo(ip_address a)
>> {
>> printf("sizeof(a) = %zu\n", sizeof(a)); // sizeof(a) returns
>> sizeof(unsigned char*)
>> }
>>
>> int main(void)
>> {
>> unsigned char a[] = { 1, 2, 3, 4 };
>>
>> foo(a); // unsigned char[4] is valid here
>> }
>>
>> $ gcc -std=c11 -O2 -Wall -Wextra ip_address_array_size.c && ./a.out
>> ip_address_array_size.c: In function ‘foo’:
>> ip_address_array_size.c:7:37: warning: ‘sizeof’ on array function
>> parameter ‘a’ will return size of ‘unsigned char *’
>> [-Wsizeof-array-argument]
>> 7 | printf("sizeof(a) = %zu\n", sizeof(a)); // sizeof(a)
>> returns sizeof(unsigned char*)
>> | ^
>> ip_address_array_size.c:5:21: note: declared here
>> 5 | void foo(ip_address a)
>> | ~~~~~~~~~~~^
>> sizeof(a) = 8
>
> Ok, my shame, you're right.
>
> Next time I will think twice before repling.
No shame, no problem.
Posts like this give a chance to clarify doubts to other readers as well.
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
on why declare a struct with a single array in it Meredith Montgomery <mmontgomery@levado.to> - 2021-11-12 15:48 -0300
Re: on why declare a struct with a single array in it Guillaume <message@bottle.org> - 2021-11-12 19:56 +0100
Re: on why declare a struct with a single array in it Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-11-12 19:31 +0000
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-11-12 21:07 +0100
Re: on why declare a struct with a single array in it pozz <pozzugno@gmail.com> - 2021-11-18 15:53 +0100
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-11-18 16:13 +0100
Re: on why declare a struct with a single array in it Manfred <noname@add.invalid> - 2021-11-18 16:26 +0100
Re: on why declare a struct with a single array in it pozz <pozzugno@gmail.com> - 2021-11-18 17:22 +0100
Re: on why declare a struct with a single array in it Manfred <noname@add.invalid> - 2021-11-18 18:04 +0100
Re: on why declare a struct with a single array in it Meredith Montgomery <mmontgomery@levado.to> - 2021-11-19 16:00 -0300
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-11-18 22:58 +0100
Re: on why declare a struct with a single array in it Guillaume <message@bottle.org> - 2021-11-19 17:53 +0100
Re: on why declare a struct with a single array in it Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-11-19 11:27 -0800
Re: on why declare a struct with a single array in it scott@slp53.sl.home (Scott Lurndal) - 2021-11-19 20:46 +0000
Re: on why declare a struct with a single array in it Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-11-19 12:52 -0800
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-11-20 13:36 +0100
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-11-20 14:49 +0000
Re: on why declare a struct with a single array in it Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-11-20 15:52 -0800
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-11-21 00:19 +0000
Re: on why declare a struct with a single array in it Richard Damon <Richard@Damon-Family.org> - 2021-11-20 20:44 -0500
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-11-21 14:51 +0100
Re: on why declare a struct with a single array in it Manfred <noname@add.invalid> - 2021-11-21 19:32 +0100
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-11-21 21:51 +0100
Re: on why declare a struct with a single array in it Manfred <noname@add.invalid> - 2021-11-22 03:17 +0100
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-11-22 11:31 +0100
Re: on why declare a struct with a single array in it Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2021-12-10 04:21 -0800
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-12-10 14:43 +0100
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-11-22 11:56 +0000
Re: on why declare a struct with a single array in it Tim Rentsch <tr.17687@z991.linuxsc.com> - 2021-12-10 01:47 -0800
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-12-10 10:55 +0000
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-12-10 14:51 +0100
Re: on why declare a struct with a single array in it Tim Rentsch <tr.17687@z991.linuxsc.com> - 2021-12-11 06:56 -0800
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-12-11 16:04 +0000
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-12-11 17:23 +0000
Re: on why declare a struct with a single array in it Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-21 05:30 -0800
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2022-01-21 13:49 +0000
Re: on why declare a struct with a single array in it "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2021-12-11 12:17 -0800
Re: on why declare a struct with a single array in it gazelle@shell.xmission.com (Kenny McCormack) - 2021-12-12 13:00 +0000
Re: on why declare a struct with a single array in it Tim Rentsch <tr.17687@z991.linuxsc.com> - 2021-12-12 08:25 -0800
Re: on why declare a struct with a single array in it gazelle@shell.xmission.com (Kenny McCormack) - 2021-12-12 17:38 +0000
Re: on why declare a struct with a single array in it Dick <thiebauddick2@aol.com> - 2021-12-12 16:19 -0500
Re: on why declare a struct with a single array in it gazelle@shell.xmission.com (Kenny McCormack) - 2021-12-13 08:06 +0000
Re: on why declare a struct with a single array in it Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2021-12-13 01:30 -0800
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-12-13 09:34 +0100
Re: on why declare a struct with a single array in it Robert Latest <boblatest@yahoo.com> - 2021-12-13 18:53 +0000
Re: on why declare a struct with a single array in it gazelle@shell.xmission.com (Kenny McCormack) - 2021-12-13 20:38 +0000
Re: on why declare a struct with a single array in it Tim Rentsch <tr.17687@z991.linuxsc.com> - 2021-12-15 00:38 -0800
Re: on why declare a struct with a single array in it gazelle@shell.xmission.com (Kenny McCormack) - 2021-12-15 11:21 +0000
Re: on why declare a struct with a single array in it Tim Rentsch <tr.17687@z991.linuxsc.com> - 2021-12-15 10:26 -0800
Re: on why declare a struct with a single array in it Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-12-15 10:45 -0800
Re: on why declare a struct with a single array in it Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-12-10 10:52 -0800
Re: on why declare a struct with a single array in it Guillaume <message@bottle.org> - 2021-11-22 04:06 +0100
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-11-22 11:32 +0000
Re: on why declare a struct with a single array in it Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-11-22 13:00 -0800
Re: on why declare a struct with a single array in it "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2021-11-21 13:08 -0800
Re: on why declare a struct with a single array in it Richard Damon <Richard@Damon-Family.org> - 2021-11-20 20:44 -0500
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-11-21 12:22 +0000
Re: on why declare a struct with a single array in it Joe Pfeiffer <pfeiffer@cs.nmsu.edu> - 2021-11-20 20:13 -0700
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-11-21 12:35 +0000
Re: on why declare a struct with a single array in it Joe Pfeiffer <pfeiffer@cs.nmsu.edu> - 2021-11-21 10:53 -0700
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-11-21 18:49 +0000
Re: on why declare a struct with a single array in it "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2021-11-21 13:04 -0800
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-11-21 14:42 +0000
Re: on why declare a struct with a single array in it Guillaume <message@bottle.org> - 2021-11-21 01:34 +0100
Re: on why declare a struct with a single array in it Bart <bc@freeuk.com> - 2021-11-21 00:48 +0000
Re: on why declare a struct with a single array in it "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2021-11-20 16:58 -0800
Re: on why declare a struct with a single array in it David Brown <david.brown@hesbynett.no> - 2021-11-21 14:40 +0100
Re: on why declare a struct with a single array in it "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2021-11-21 12:59 -0800
Re: on why declare a struct with a single array in it scott@slp53.sl.home (Scott Lurndal) - 2021-11-21 15:58 +0000
Re: on why declare a struct with a single array in it gazelle@shell.xmission.com (Kenny McCormack) - 2021-11-20 10:55 +0000
Re: on why declare a struct with a single array in it Jorgen Grahn <grahn+nntp@snipabacken.se> - 2021-11-13 08:47 +0000
Re: on why declare a struct with a single array in it Guillaume <message@bottle.org> - 2021-11-13 18:23 +0100
Re: on why declare a struct with a single array in it Kaz Kylheku <480-992-1380@kylheku.com> - 2021-11-13 17:55 +0000
Re: on why declare a struct with a single array in it Anton Shepelev <anton.txt@g{oogle}mail.com> - 2021-11-19 13:14 +0300
Re: on why declare a struct with a single array in it Meredith Montgomery <mmontgomery@levado.to> - 2021-11-19 16:07 -0300
csiph-web