Нет, строковый литерал "somestring"
это уже массив символов, почти наверняка созданный вашим компилятором.
То, что делает это утверждение, устанавливает str
для указания на первый символ. Если бы вы посмотрели на базовый ассемблерный код, он бы выглядел следующим образом:
str314159: db "somestring", 0 ; all string literals here.
: : : :
load r0, str314159 ; get address of string
stor r0, -24[sp] ; store it into local var str.
В большом количестве случаев массив распадется на указатель на первый элемент этого массива (с некоторыми ограниченными исключениями, например, при выполнении sizeof
).
Например, следующий код C:
#include <stdio.h>
int main (void) {
char *somestr = "Hello";
puts (somestr);
return 0;
}
при компиляции с gcc -S
для генерации сборки x86 дает нам (с удаленным несущественным заголовком):
.LC0:
.string "Hello"
.text
.globl main
.type main, @function
main:
pushl %ebp ; Standard set up of stack frame,
movl %esp, %ebp ; aligning and making
andl $-16, %esp ; room for
subl $32, %esp ; local variables.
movl $.LC0, 28(%esp) ; Load address of string in to somestr.
movl 28(%esp), %eax ; Call puts with that variable.
movl %eax, (%esp)
call puts
movl $0, %eax ; Set return code.
leave ; Tear down stack frame and return.
ret
Вы можете видеть, что адрес первого символа, .LC0
, действительно загружен в переменную somestr
. И, хотя это может быть неочевидно, .string
создает массив символов, оканчивающихся символом NUL.