空间定义的问题

碧咸 2009-04-29 04:28:14
int t[1000000000000]; //error

但是

int *pt = new int[10000000000000]; //right

为什么呢?
望各位高手从原理上给出原因何在...
越中肯的给分
...全文
72 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ozyozy1 2009-04-29
  • 打赏
  • 举报
回复
vs2008 int *pt = new int[10000000000000]; //right 这个也编不过
不过估计是
int t[1000000000000]; //error 这个是在栈上分配的内存 一般比较小
int *pt = new int[10000000000000]; //right 这个是在堆上分配的内存 堆比栈要大得多
pengzhixi 2009-04-29
  • 打赏
  • 举报
回复
因为栈空间是连续的,所以在大小方面受到很大限制,而堆的空间不连续,所以大小限制比栈要自由些
agchen81 2009-04-29
  • 打赏
  • 举报
回复
第一个在栈上分配空间,栈的大小受限,默认好像是4M;
第二个属于动态分配,在堆上分配,大小受进程空间可用内存大小的限制,一般足够大。

所以,new出来的内存要delete分别,而第一种方法的就不用delete。

具体,到网上搜一下栈与堆的区别吧。
mengde007 2009-04-29
  • 打赏
  • 举报
回复
一个是编译时;一个是运行时;
pengzhixi 2009-04-29
  • 打赏
  • 举报
回复
int t[1000000000000];//从栈上分配内存空间,肯定不够
int *pt = new int[10000000000000];//从堆上分配空间,pt指针的空间在栈上.
jackzhhuang 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 beckson 的帖子:]
int t[1000000000000]; //error

但是

int *pt = new int[10000000000000]; //right

为什么呢?
望各位高手从原理上给出原因何在...
越中肯的给分
[/Quote]

前者是编译的时候编译器检查,当然就可以在这个阶段检查出错,因为内存分配过大了。

后者是程序运行时动态分配内存,编译器是不会检查的,所以在运行时必定会崩溃——除非你的内存很大。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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