首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

分享帖供菜鸟看一下:数组到底是在栈中还是在堆中的

2012-03-11 
分享帖供初学者看一下:数组到底是在栈中还是在堆中的原帖地址:http://hi.baidu.com/sqldebug/blog/item/97

分享帖供初学者看一下:数组到底是在栈中还是在堆中的
原帖地址: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这么实现是合理的,在函数里中分配的固定长度数组放在栈中可以加快运行效率,而且在多线程的情况下,不用像堆分配有加锁。只是大家在写程序的过程中注意在函数里定义太长的数组需要注意,否则栈溢出,程序就崩溃了。

[解决办法]
支持一下,多点这样的帖子不错
[解决办法]
支持~~~
[解决办法]
一般来说函数过程局部变量都在栈中申请。全局变量都在堆中。
不过如果是局部指针就不一定在栈中
比如 
function myfun:boolean;
var 
 _mem:Pointer;
begin
 _mem:=GetMemory(Size);
....
end;
_mem指向的内存就不在栈而在堆。
[解决办法]
好帖?!!!!!!!!
[解决办法]
支持一下
[解决办法]
支持。。。
[解决办法]
不会 学习了......
[解决办法]
好!我知道一点
[解决办法]
谢谢 分享!!
[解决办法]
这是Delphi~!
[解决办法]
堆堆栈栈
支持一下
[解决办法]
学习啦~
谢谢
[解决办法]
xie xie lz
[解决办法]
真实太好了
[解决办法]
总结的很好。
[解决办法]
支持楼主多发此贴
[解决办法]
我是来学习好帖的
[解决办法]
mark
[解决办法]
不太明白。。。
[解决办法]
狂顶 支持 在哪
[解决办法]
感谢LZ分享
[解决办法]
fda
[解决办法]
mark, 学习
------解决方案--------------------


值得学习啊
[解决办法]
支持一下,多点这样的帖子不错
[解决办法]
支持一下,多点这样的帖子不错
[解决办法]
支持一下,多点这样的帖子不错
[解决办法]
学习了
[解决办法]
不错,看来只有函数体那的固定数组才使用栈
[解决办法]
不错 学习了。
[解决办法]
支持~~~!!!!!!
[解决办法]
学习。。
[解决办法]
谢谢你
[解决办法]
学习中。。。呵呵
[解决办法]
谢谢 分享!!

[解决办法]
呵呵 不错
[解决办法]
每个学习delphi的人对objectPascal都要精研细读,delphi很容易编程,但如果语言基础不牢,程序很容易出错。
[解决办法]
谢谢楼主 分享 学习中。。。呵呵
[解决办法]
支持。。。
[解决办法]
FEICHANGGANXIE,又学到了呵呵
[解决办法]
顶一下
[解决办法]
又懂了一点~~~
[解决办法]
支持一下!!!
[解决办法]
支持一下!!!
[解决办法]
支持下,学习了。
[解决办法]
。。。
被推荐骗进来了,也没个标记说是针对Delphi的。
[解决办法]
是所有的语言都是这样分配吗?
[解决办法]
支持一下,
[解决办法]
来接分
[解决办法]
支持!
[解决办法]
学习了。感谢分享。
[解决办法]
没仔细研究过这个问题,要学习一下了。
[解决办法]
3、固定数组全局变量是在堆中的
-------------------------------
全局变量要看起有没有初始化,,未初始化的放在未初始化段(bss)中,初始化的放在初始化段中。。。
[解决办法]
这个不错好帖该顶
[解决办法]
恩 ,好样的哦
[解决办法]
太深奥了
[解决办法]
有人会金蝶K310.0专业版的加密破解吗?


[解决办法]
至此支持
[解决办法]
支持!
此至敬礼
[解决办法]
支持一下,多点这样的帖子不错
[解决办法]
同上, up
[解决办法]
好帖,谢了楼主
[解决办法]
很好的知识帖,谢谢楼主。
[解决办法]
好帖,顶一下!
[解决办法]
好~支持
[解决办法]
分享.....
[解决办法]
学习 学习
[解决办法]
guo
[解决办法]
全套java教程下载,赶紧支持!
[解决办法]
支持一下
[解决办法]
基础太差 没读懂
[解决办法]
学习。。
[解决办法]
固定数组在函数体内分配是在栈中的

只要把这个记住就好了,其余都是在堆中
[解决办法]
哦 原本来一直以为一定是在栈里呢 这回见识到俄
[解决办法]
谢谢奉献
[解决办法]
支持。。。。。。
[解决办法]
好东西啊 支持!!
[解决办法]
学习了
[解决办法]
DINGDINGIDNGIDNG
[解决办法]
支持一下,多点这样的帖子不错
[解决办法]
学C的菜鸟路过!
[解决办法]
学习。。
[解决办法]
学习 先顶再看
[解决办法]
好帖,强烈支持!


不过数据类型在堆、栈中储存的大小好像还和你的操作系统所支持的位数有关系



[解决办法]
B2C网上商城精准广告投放策略(图)
http://www.53news.net/2010/0402/170395.html

解读国外物流奥秘
http://www.53news.net/2010/0402/170397.html

浅谈网络营销之搜索引擎优化方法
http://www.53news.net/2010/0402/170393.html

注册和登录远没有你想象的那么简单。。。...
http://www.53news.net/2010/0402/170392.html
[解决办法]
学习~学习~

热点排行