分享帖供初学者看一下:数组到底是在栈中还是在堆中的

SQLDebug_Fan 2010-04-02 04:17:21
加精
原帖地址:http://hi.baidu.com/sqldebug/blog/item/9758b9ffa605e51a09244d91.html

数组单一说在栈中还是堆中都是错误的,分为几种情况:

1、固定数组在函数体内分配是在栈中的

我们做一个试验,一般DELPHI程序线程的栈大小是1M,如果我们函数体中申请4M大小的数组,报栈溢出,则表示数据的大小是在栈中的。

const
CArrayCount = 1024*1024*4;

procedure TForm1.btnMainThreadClick(Sender: TObject);
var
MainThreadArray: array[1..CArrayCount] of Char;
i: Integer;
begin
for i := Low(MainThreadArray) to High(MainThreadArray) do
MainThreadArray[i] := #0;
end;

我把以上代码在主线程中测试时,确实报了栈溢出,如果这时你把DELPHI程序的栈调大为6M则正确,表示在函数体中申请的数组是在栈中的。

2、固定数组在类中分配是在堆中的

我们在类中加一下定义语句

FFixArray: array[1..CArrayCount] of Char;

程序正常,表示在类中分配固定数组是在堆中的。

3、固定数组全局变量是在堆中的

我们在程序定义全部数组

GFixArray: array[1..CArrayCount] of Char;

程序也正常,表示全局固定长度是在堆中的。

3、动态数组不管在函数体中、类中、全局变量都是在堆中

如果你会汇编,看一下汇编就明白了。DELPHI这么实现是合理的,在函数里中分配的固定长度数组放在栈中可以加快运行效率,而且在多线程的情况下,不用像堆分配有加锁。只是大家在写程序的过程中注意在函数里定义太长的数组需要注意,否则栈溢出,程序就崩溃了。
...全文
5560 163 打赏 收藏 转发到动态 举报
写回复
用AI写文章
163 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainychan2009 2010-06-26
  • 打赏
  • 举报
回复
怯怯的问下,怎么设置Delphi的堆栈大小?以前在书上看过,但是没有注意,刚刚在Delphi中找了下设置没有找到,在BAIDU中也没有搜到,求解,谢谢
luo_342815 2010-06-10
  • 打赏
  • 举报
回复
。。学习了。我一直以为堆栈是一个意思。

最近在一个BUTTON响应函数里面 申请数组变量。100万的byte不会出错 1000万就出错了。
onlylzy 2010-04-23
  • 打赏
  • 举报
回复
mark 学习了
yyfhz 2010-04-22
  • 打赏
  • 举报
回复
mark
wangyin2001 2010-04-22
  • 打赏
  • 举报
回复
在什么时候才会用到这个技术呢?
还是江筱吧 2010-04-22
  • 打赏
  • 举报
回复
学习了
skertone 2010-04-21
  • 打赏
  • 举报
回复
全局变量 准确地说 应该不是在堆中


var
Form1: TForm1;
g_arry: array[0..100] of char;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
l_arry: array[0..100] of char;
p_arry: PChar;
begin
GetMem(p_arry,100);


Memo1.Lines.Add('garry = '+ IntToHex(Integer(addr(g_arry[0])),8));
Memo1.Lines.Add('larry = '+ IntToHex(Integer(addr(l_arry[0])),8));
Memo1.Lines.Add('parry = '+ IntToHex(Integer(addr(p_arry[0])),8));
Memo1.Lines.Add('parry^= '+ IntToHex(Integer(p_arry^),8));

GetMem(p_arry,100);
Memo1.Lines.Add('parry = '+ IntToHex(Integer(addr(p_arry[0])),8));
Memo1.Lines.Add('parry^= '+ IntToHex(Integer(p_arry^),8));


end;

end.

结果:
Memo1
garry = 00453BD4
larry = 0012F557
parry = 00CD24E0
parry^= 00000008
parry = 00CD3EF0
parry^= 000000EC




jsl8998620 2010-04-21
  • 打赏
  • 举报
回复
好贴!支持一下
时光审美 2010-04-21
  • 打赏
  • 举报
回复
从表面看本质 顶。
b_duan 2010-04-21
  • 打赏
  • 举报
回复
学习了
jaingzhengr 2010-04-10
  • 打赏
  • 举报
回复
好贴,向楼主学习
xiaoyaolanchong 2010-04-10
  • 打赏
  • 举报
回复
学习了!
xiaoxiangqing 2010-04-08
  • 打赏
  • 举报
回复
数组大的话,放在堆中;数组小的话,放在栈中。
cmychq 2010-04-08
  • 打赏
  • 举报
回复
学习了
taste品味 2010-04-08
  • 打赏
  • 举报
回复
学习了 神人
tylzyoudi 2010-04-08
  • 打赏
  • 举报
回复
来学习,非常感谢!
  • 打赏
  • 举报
回复
看了!不错!!
ysgs129 2010-04-07
  • 打赏
  • 举报
回复
ding
WHJPBH 2010-04-07
  • 打赏
  • 举报
回复
学习 先顶再看
zhuweiping2003 2010-04-07
  • 打赏
  • 举报
回复
very well
加载更多回复(136)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧