与编译器有关:
好吧,我承认我看了汇编代码
vc:
_TEXT
SEGMENT
_d$ = -8
_s$ = -12
char d[]="456789";
mov
eax, DWORD PTR ??_C@_06GMII@456789?$AA@
mov
DWORD PTR _d$[ebp], eax
mov
cx, WORD PTR ??_C@_06GMII@456789?$AA@+4
mov
WORD PTR _d$[ebp+4], cx
mov
dl, BYTE PTR ??_C@_06GMII@456789?$AA@+6
mov
BYTE PTR _d$[ebp+6], dl
; 7
:
char s[]="123";
mov
eax, DWORD PTR ??_C@_03KHCO@123?$AA@
; `string'
mov
DWORD PTR _s$[ebp], eax
对栈的初始化,很明显先声明的d在高位,s在低位,就会出现前面结果
tc:
_DATA
segment word public 'DATA'
d@
label
byte
db
52
;d[]
db
53
db
54
db
55
db
56
db
57
db
0
db
49
;s[]
db
50
db
51
db
0
_DATA
ends
lea
ax,word ptr [bp-12]
push
ax
push
ds
mov
ax,offset DGROUP:d@
push
ax
mov
cx,7
call
far ptr SCOPY@
;复制d到低地址
push
ss
lea
ax,word ptr [bp-4]
push
ax
push
ds
mov
ax,offset DGROUP:d@+7
push
ax
mov
cx,4
call
far ptr SCOPY@
;复制s到高地址
于是结果为456789 456789(越界了?)
还有
我菜119 你知道那个填充的cc字节是怎么来的吗?为什么要用它填充?
tc下有点小问题,然我再看看
(tc下好像把返回地址给覆盖了)
[
本帖最后由 xiaomarn 于 2010-12-18 21:17 编辑 ]