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.
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)