I stumbled upon this function in an answer to this question:
/* Note: I\'ve formatted the code for readability. */
const char * getString() {
const char *x =
In C, string literals have static storage duration. Your code is logically equivalent to:
const char * getString() {
static const char literal[] = "abcstring";
const char *x = literal;
return x;
}
with the exception that in the version with the string literal, the storage for the string could overlap with the storage of other string literals.
It varies per ABI, but on x86 they're in static memory/DATA page, pointed to by the DS register.
As an addendum to most of the other answers, you can look at the assembler the compiler generates (e.g. by passing -S
to GCC) to see how they are stored. Putting your function into a file by itself, we find that GCC basically generates (I've removed some irrelevant stuff):
.section .rodata
.LC0:
.string "abcstring"
.text
.globl getString
.type getString, @function
getString:
# load the address of ".LC0" which is the start of the "abcstring"
movl $.LC0, %eax
ret
So the string is stored in the .rodata
section ("read-only data"), not on the stack and so it has a "global" address (and is always in scope).
Similarly, the string literal in myfunc("thisisastring")
is also placed into a .rodata
section, and is not on the stack.