与编译器有关:
好吧,我承认我看了汇编代码
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 编辑 ]