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.