SPRUI04F july 2015 – april 2023
In C, a character string constant is used in one of the following ways:
char s[] = "abc";
When a string is used as an initializer, it is simply treated as an initialized array; each character is a separate initializer. For more information about initialization, see Section 8.9.
strcpy (s, "abc");
When a string is used in an expression, the string itself is defined in the .const:string section with the .string assembler directive, along with a unique label that points to the string; the terminating 0 byte is explicitly added by the compiler. For example, the following lines define the string abc, and the terminating 0 byte (the label SL5 points to the string):
.sect ".const:string"
$C$SL5: .string "abc",0
String labels have the form $C$SLn, where $C$ is the compiler-generated symbol prefix and n is a number assigned by the compiler to make the label unique. The number begins at 0 and is increased by 1 for each string defined. All strings used in a source module are defined at the end of the compiled assembly language module.
The label $C$SLn represents the address of the string constant. The compiler uses this label to reference the string expression.
Because strings are stored in the .const section (possibly in ROM) and shared, it is bad practice for a program to modify a string constant. The following code is an example of incorrect string use:
const char *a = "abc"
a[1] = 'x'; /* Incorrect! undefined behavior */