static 局部变量存在那个位置?
如题
我自己查资料得出的结果是在静态区
但是有人跟我说是在堆区,这让我感到很诧异,这到底是怎么一回事?
[解决办法]
这具体得看编译器的实现吧。有的编译器会把只读段和代码段合并。
[解决办法]
可以放在全局区
[解决办法]
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放
[解决办法]
请参考:
一个进程在内存中的布局
[解决办法]
全局变量和静态数据都在全局数据区。即使是函数内部的静态局部变量也是如此。
[解决办法]
TITLEb.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXTSEGMENT PARA USE32 PUBLIC 'CODE'
_TEXTENDS
_DATASEGMENT DWORD USE32 PUBLIC 'DATA'
_DATAENDS
CONSTSEGMENT DWORD USE32 PUBLIC 'CONST'
CONSTENDS
_BSSSEGMENT DWORD USE32 PUBLIC 'BSS'
_BSSENDS
_TLSSEGMENT DWORD USE32 PUBLIC 'TLS'
_TLSENDS
FLATGROUP _DATA, CONST, _BSS
ASSUMECS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC_g_f
;---------------------------------数据段 start
_DATASEGMENT
COMM_g_e:DWORD ;g_e
_scDD05H ;sc
_g_fDD03H ;g_f
_?sg@?1??main@@9@9 DD 0aH ;sg
_DATAENDS
;-------------------------------数据段 end
PUBLIC_main
;-------------------------------BSS段 start
;BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。
;注意和数据段的区别,BSS存放的是未初始化的全局变量和静态变量,数据段存放的是初始化后的全局变量和静态变量。
_BSSSEGMENT
_sdDD01H DUP (?) ;sd
_?sh@?1??main@@9@9 DD 01H DUP (?) ;sh
_BSSENDS
;------------------------------BSS段 end
_TEXTSEGMENT
_a$ = -4
_b$ = -8
_mainPROC NEAR
; File b.c
; Line 10
pushebp
movebp, esp
subesp, 8
; Line 14
movDWORD PTR _a$[ebp], 25; 00000019H
; Line 17
movDWORD PTR _?sh@?1??main@@9@9, 100; 00000064H
; Line 18
movDWORD PTR _sd, 20; 00000014H
; Line 19
movDWORD PTR _g_e, 30; 0000001eH
; Line 21
movDWORD PTR _b$[ebp], 18; 00000012H
; Line 23
movesp, ebp
popebp
ret0
_mainENDP
_TEXTENDS
END