函数的堆栈空间居然有限制!
函数的堆栈空间居然有限制!
很多年来,一直以为函数的堆栈空间可以是无限的,或者说仅受硬盘的限制。
然而今天在solaris 8 (sun sparc, gcc)上写了这样一小段程序:
main()
{
char s[8385097];
printf("ok");
}
运行时 segment fault (core dumped)
把8385097改成8385096,就可以了!
我想这是因为堆栈空间有限制所导致的。
8385096 + 3512 = 8M。
就是说一个进程所允许的静态空间接近8M。
也许我应该再看一下sun sparc的寻址范围。
我目前的猜想是:受到SUN SPARC寻址范围的限制,一个进程只允许8M的静态空间,其中又有3512个字节用来放PCB之类的东西,所以只剩 8385096 个字节了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
跟寻址范围没有关系。
堆栈的大小是可以调整的。
情场探花th老师?
OS里,一般来说会指定栈的大小,否则调度的成本太大,很多OS下栈的大小可修改。
再大也总不能超过物理内存+Swap的大小吧,呵呵
要有人说"函数的堆栈空间居然无限制!" 估计这系统就要崩了.
操作系统没有这么脆弱的。
这不是‘函数‘栈空间的限制, 而是进程栈空间的限制。
man -s 2 setrlimit
栈不关malloc什么事情,这是不同的内存段。