pax*_*blo 14
不,字符串文字"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.
Run Code Online (Sandbox Code Playgroud)
在很多情况下,数组会衰减到指向该数组的第一个元素的指针(有一些有限的例外,比如在做的时候sizeof).
举例来说,以下C代码:
#include <stdio.h>
int main (void) {
char *somestr = "Hello";
puts (somestr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当编译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
Run Code Online (Sandbox Code Playgroud)
您可以看到第一个字符的地址.LC0确实已加载到somestr变量中.而且,虽然它可能不会立即显现.string,但是创建一个由NUL字符终止的字符数组.