| Deutsch English Français Italiano |
|
<868qnb5gg6.fsf@linuxsc.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Tim Rentsch <tr.17687@z991.linuxsc.com>
Newsgroups: comp.lang.c
Subject: Re: Regarding assignment to struct
Date: Mon, 05 May 2025 06:34:49 -0700
Organization: A noiseless patient Spider
Lines: 43
Message-ID: <868qnb5gg6.fsf@linuxsc.com>
References: <vv338b$16oam$1@dont-email.me> <vv4j9p$33vhj$1@dont-email.me> <86plgo7ahu.fsf@linuxsc.com> <vv9hu7$3nomg$1@dont-email.me> <87o6w7h2wn.fsf@nosuchdomain.example.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Injection-Date: Mon, 05 May 2025 15:34:52 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="b2f20e442295d938e3644788cf940be7";
logging-data="629572"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+LSUUpE3kd+yib2SlAw/muZR165rW2d0I="
User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux)
Cancel-Lock: sha1:gq4pRF2C+IwIIAdmD/hp8cv0X9U=
sha1:2qNixOlAXQrGmyq9c2oxpmU7enc=
Keith Thompson <Keith.S.Thompson+u@gmail.com> writes:
> Andrey Tarasevich <noone@noone.net> writes:
> [...]
>
>> #include <stdio.h>
>>
>> struct S { int a[10]; };
>>
>> int main()
>> {
>> struct S a, b = { 0 };
>> int *pa, *pb, *pc;
>>
>> pa = &a.a[5];
>> pb = &b.a[5];
>> pc = &(a = b).a[5];
>>
>> printf("%p %p %p\n", pa, pb, pc);
>> }
>
> [...]
>
> I think that code has undefined behavior.
Right. [*]
> (a = b) is an rvalue that refers to an object of type struct S with
> temporary lifetime. pc holds the address of a subobject of that
> temporary object. The object reaches the end of its lifetime at the end
> of the evaluation of the full expression. You then print its value.
Even if the printf() statement were replaced by
(void)pc;
the behavior would be undefined, because the pointer held in pc
becomes indeterminate as soon as the statement containing the
assignment to pc completes.
[*] Assuming C11 semantics. At best inadvisable under C99
semantics, and a constraint violation under C90 semantics.