Deutsch English Français Italiano |
<v1o1jf$23e1e$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: David Brown <david.brown@hesbynett.no> Newsgroups: comp.lang.c Subject: Re: storage of string literals Date: Sat, 11 May 2024 17:07:25 +0200 Organization: A noiseless patient Spider Lines: 48 Message-ID: <v1o1jf$23e1e$1@dont-email.me> References: <87r0e8mx8s.fsf@tudado.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sat, 11 May 2024 17:07:27 +0200 (CEST) Injection-Info: dont-email.me; posting-host="e065d27d964d081eeac047b5b066e87e"; logging-data="2209838"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18fWr0hOpDhu4Mgny1YLffDzPoxf4/bM/8=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:l9L0iRBQ3OqiAbBfg6lVb215aVw= Content-Language: en-GB In-Reply-To: <87r0e8mx8s.fsf@tudado.org> Bytes: 3133 On 11/05/2024 12:57, Johanne Fairchild wrote: > I don't think the standard says anything about where a string literal > would be allocated. Could a compiler allocate on the stack string > literals defined inside a procedure? (Can I say that ``string > literals'' are /defined/ or should use a different word?) So that, for > instance, when the procedure dealWord (below) returns, token->category > would point nowhere. > > --8<-------------------------------------------------------->8--- > typedef struct Token stoken; > > struct Token { > char *category; > }; > > void dealWord(stoken *token) { > token->category = "cat1"; > [...] > } > --8<-------------------------------------------------------->8--- > > Section 6.2.4 of C99 has title ``storage durations of objects''. Point > 4 says > > --8<-------------------------------------------------------->8--- > An object whose identifier is declared with no linkage and without the > storage-class specifier static has automatic storage duration. > --8<-------------------------------------------------------->8--- > > Are string literals objects? Thanks! String literals result in arrays of static duration, and so I think are objects. However, they do not necessarily have unique addresses, and can overlap. The C standards say very little about how they are handled - it's all up to the implementation. Since they are read only and static, they are almost always implemented in the text section of the binary, along with other read-only data beside executable code. It is only on targets with distinct instructions for accessing code and data space that they go anywhere else. They are never, AFAIK, allocated on the stack. What would be the point? In almost all implementations they are in the text section of the binary and accessible directly from there - copying them to local memory on the stack would give no benefits. On targets where such text memory can't be read as conveniently (such as some old microcontrollers or DSPs), they would most likely be copied into data ram on program startup.