Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Vir Campestris Newsgroups: comp.lang.c Subject: Re: relearning C: why does an in-place change to a char* segfault? Date: Tue, 13 Aug 2024 15:34:19 +0100 Organization: A noiseless patient Spider Lines: 32 Message-ID: References: <87jzh0gdru.fsf@nosuchdomain.example.com> <865xs54fak.fsf@linuxsc.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Tue, 13 Aug 2024 16:34:20 +0200 (CEST) Injection-Info: dont-email.me; posting-host="e0038d546466fb789c935a51995a223b"; logging-data="4103985"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+GW/ECAtXKkAoWQn9VixDOARnMoQh2nWg=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:/xFj6mhYvvEOiXA/gkqvumtmc20= In-Reply-To: <865xs54fak.fsf@linuxsc.com> Content-Language: en-GB Bytes: 2099 On 12/08/2024 22:11, Tim Rentsch wrote: > Keith Thompson writes: > > [...] > >> A string literal creates an array object with static storage >> duration. [...] > > A small quibble. Every string literal does sit in an array, > but it might not be a _new_ array, because different string > literals are allowed to overlap as long as the bytes in the > overlapping arrays have the right values. And this is exactly why string literals should always have been const. A compiler is entitled to share memory between strings. so puts("lap"); puts("overlap"); it's entitled to make them overlap. Then add char * p = "lap"; *p='X'; and it can overwrite the shared string. I think. which would mean that writing "lap" again would have a different result. But that ship has sailed. I'm not even sure const had been invented that far back! Andy