关于设置栈空间大小

chennut0802 2011-09-20 10:00:56
大家好,我在vs2008写了以下测试程序:


void main()
{
char buf1[1000000];
char buf2[1000000];
}



发现编译器提示“ 应用程序发生异常 unknown software exception (0xc00000fd),位置为 0x0042d8e7。”出错。
我已经把“项目属性->链接器->系统->堆栈提交大小”设置为3000000,不知道为什么还会提示栈空间不足呢?请问是什么原因导致设置失效?或者由其它什么原因引起的呢?谢谢大家!
...全文
906 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
udbfulzzg 2012-10-16
  • 打赏
  • 举报
回复
11?
pathuang68 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chennut0802 的回复:]

请问各位几个问题:
1.“堆栈提交大小”和“堆栈保留大小”之间有什么不同呢?
2.为什么前者设置可以生效,后者却不可以呢?
3.后者有什么用呢?
谢谢!
[/Quote]
1. “堆栈保留大小”就是可用堆栈的最大值,“堆栈提交大小”就是实际可使用堆栈的大小。一般要让“堆栈提交大小”小于或等于“堆栈保留大小”。

2. 如果“堆栈保留大小”小于“堆栈提交大小”应该是不可以的,参考1的说明。

3. 后者的用处可以提高程序运行效率。
chennut0802 2011-09-24
  • 打赏
  • 举报
回复
请问各位几个问题:
1.“堆栈提交大小”和“堆栈保留大小”之间有什么不同呢?
2.为什么前者设置可以生效,后者却不可以呢?
3.后者有什么用呢?
谢谢!
chennut0802 2011-09-22
  • 打赏
  • 举报
回复
谢谢15楼的朋友。clean之后果然得到希望的结果。但是请问问题:
1.“堆栈提交大小”和“堆栈保留大小”之间有什么不同呢?
2.为什么前者设置可以生效,后者却不可以呢?
3.后者有什么用呢?
谢谢!
pathuang68 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 chennut0802 的回复:]

谢谢11楼的朋友,我按照你的方法设置4MB,程序正常运行。然后我尝试把Stack Reserve Size改回默认值0,重新编译,程序居然还可以正常运行。我的重新设置似乎没有生效,而且我已经rebuild了,请问各位是什么原因导致这个问题呢?谢谢!
[/Quote]

把项目clean后再试试?
pathuang68 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhao4zhong1 的回复:]

C/C++ code
void main()
{
static char buf1[1000000];
static char buf2[1000000];
}


在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可。
[/Quote]

要是这样也可以的话,那楼主直接用malloc在堆上分配空间算了。
赵4老师 2011-09-21
  • 打赏
  • 举报
回复
void main()
{
static char buf1[1000000];
static char buf2[1000000];
}

在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可。
pathuang68 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chennut0802 的回复:]

各位,我已经rebuild工程了,请问会是什么原因造成呢?
[/Quote]

可以修改的。
方法如下:
菜单Project、XX项目属性、Configuration Properties、Linker、System,然后将右边的Stack Reserve Size改成4194304(= 4 * 1024 * 1024 = 4MB),重新rebuild,再重新运行代码。肯定木有问题滴。

比如做完上如设置后,在代码中char a[3 * 1024 * 1024];这样写是OK的。但不能写成char a[4 * 1024 * 1024]; 因为写成char a[4 * 1024 * 1024];就把整个设置的stack大小全部用光了,这是不可以的,因为程序的其他部分也要用一些stack的。

通常,你可以设定数组的大小为Stack Reserve Size建1MB,这1MB就相当于未修改Stack Reserve Size时系统的缺省值。剩下的Stack Reserve Size - 1MB的空间,你想怎么用都可以。
chennut0802 2011-09-21
  • 打赏
  • 举报
回复
谢谢11楼的朋友,我按照你的方法设置4MB,程序正常运行。然后我尝试把Stack Reserve Size改回默认值0,重新编译,程序居然还可以正常运行。我的重新设置似乎没有生效,而且我已经rebuild了,请问各位是什么原因导致这个问题呢?谢谢!
tony2278 2011-09-21
  • 打赏
  • 举报
回复
申请空间过大?
chennut0802 2011-09-21
  • 打赏
  • 举报
回复
各位,我已经rebuild工程了,请问会是什么原因造成呢?
ma100 2011-09-20
  • 打赏
  • 举报
回复
你没有rebuild工程而已
chennut0802 2011-09-20
  • 打赏
  • 举报
回复
各位,我设置成3000000即3M不行,设置成4M(2的整次方),也是不行,请问为什么呢?
辰岡墨竹 2011-09-20
  • 打赏
  • 举报
回复
避免用过大的栈,很容易出问题,性能上也不推荐,建议用堆。
诶呦 2011-09-20
  • 打赏
  • 举报
回复
栈有限制,1M
碎碎念 2011-09-20
  • 打赏
  • 举报
回复
栈空间应该是1024KB,超过就会提示异常。。。
jackyjkchen 2011-09-20
  • 打赏
  • 举报
回复
别用超过1MB的数组

改栈用/stack:xxx
应该和你这个方式是等效的,但一般改栈大小都用2的整次方
Jake443403168 2011-09-20
  • 打赏
  • 举报
回复
怎么也是有个上限的,照lz想的那样内存条的钱都省了
qq120848369 2011-09-20
  • 打赏
  • 举报
回复
这是多大啊,字节?

操作系统自身是有限制的,不是你要多少就多少的...

linux下用Ulimit,win下木知。

65,196

社区成员

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

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