Sujet : Re: Regarding assignment to struct
De : jameskuyper (at) *nospam* alumni.caltech.edu (James Kuyper)
Groupes : comp.lang.cDate : 04. May 2025, 04:38:47
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vv6ng8$1410m$1@dont-email.me>
References : 1 2 3 4
User-Agent : Mozilla Thunderbird
On 5/3/25 20:37, Keith Thompson wrote:
Lawrence D'Oliveiro <ldo@nz.invalid> writes:
On Sat, 3 May 2025 01:14:46 -0700, Andrey Tarasevich wrote:
Virtually every C project relies on assignment of structures.
Passing-returning structs by value might be more rare (although
perfectly valid and often appropriate too), but assignment...
assignment is used by everyone everywhere without even giving it a
second thought.
>
There is a caveat, to do with alignment padding: will this always have a
defined value?
I don't believe so. In a quick look, I don't see anything in
the standard that explicitly addresses this, but I believe that a
conforming implementation could implement structure assignment by
copying the individual members, leaving any padding in the target
undefined.
"When a value is stored in an object of structure or union type,
including in a member object, the bytes of the object representation
that correspond to any padding bytes take unspecified values.56)"
(6.2.6.1p6).
That refers to footnote 56, which says "Thus, for example, structure
assignment need not copy any padding bits."
Note that, even when writing to a single member, the representations in
the padding bytes might be affected. A plausible reason for this to
happen would be, for example when a value is written to an 8-bit strujct
field followed by 8 bits of padding on a machine where the word size is
16 bits. The wording of that clause permits the use of instructions that
change the contents of an entire word to be used when updating that field.
Finally, why would you care?
The fact that an implementation does not have to do the equivalent of
memcpy() to perform a struct copy means that successful assignment
cannot be checked by using memcmp().