zklhp开始学C了
那个是编译器的事。和C标准应该没什么关系。
VC编译器是把ASDFGHJ作为一个常量保存在.rdata节中。
装入内存时做为局部变量传入地址。
LEA EDI,DWORD PTR SS:[EBP-D8]
MOV ECX,36
;初始化堆栈大小计数
MOV EAX,CCCCCCCC
;局部变量用全C初始化
REP STOS DWORD PTR ES:[EDI]
;循环填C
MOV DWORD PTR SS:[EBP-8],test.0041574C
; ASCII "ASDFGHJ"
;0041574C地址位于.rdata节中 字符串地址。
char *a = "ASDFGHJ";
可以理解成a= (int)"ASDFGHJ";
MOV DWORD PTR SS:[EBP-14],test.0041574C
; ASCII "ASDFGHJ"
可以理解成 b= (int)"ASDFGHJ";
在装入内存运行时,.rdata节中有这个串,
a和b 作为主函数的局部变量,位置在堆栈中,a地址SS:[EBP-8],b地址
SS:[EBP-14],他们的内容都是一个int型的4字节地址0041574C。对于它们
的使用都是通过0041574C使用的,内存中并不会有2个或多个"ASDFGHJ",输出
ab的值当然都一样都是0041574C,但是ab的地址是不同的。
MOV ESI,ESP
MOV EAX,DWORD PTR SS:[EBP-14]
PUSH EAX
; 给printf传参b
MOV ECX,DWORD PTR SS:[EBP-8]
PUSH ECX
;给printf传参a
PUSH test.0041573C
; ASCII "a=%lx b=%lx"
格式控制字符串,也是位于.rdata中
CALL DWORD PTR DS:[<&MSVCR80D.printf>]
; MSVCR80D.printf
3楼用的环境我没有。
但是是不是把他们当成2个”不同“的串,这个估计不是吧?因为如果是
当成2个来编译,最后输出的2个值应该位置相邻或者很近。
看截图,a的值似乎是临时分配的.