C 堆栈大小可以动态更改吗?如何更改?

C 堆栈大小可以动态更改吗?如何更改?,c,stack,C,Stack,在C语言中可以动态更改堆栈大小吗 如果是,怎么做?为什么需要这样做?它取决于操作系统,而不是C本身直接参与的事情(尽管特定的链接器和运行时环境有不同的方式来管理这些东西的配置) 你有什么操作系统,你想实现什么?动态地说,你的意思是在代码执行时更改堆栈大小吗?哎呀,那是办不到的。但是,您可以在运行应用程序之前设置堆栈大小。您可以在linux中使用“ulimit-s”命令来实现这一点,该命令将为在该shell下执行的所有进程设置堆栈大小 对于windows,同样可以在VC6中通过在项目属性->链接选

在C语言中可以动态更改堆栈大小吗


如果是,怎么做?

为什么需要这样做?它取决于操作系统,而不是C本身直接参与的事情(尽管特定的链接器和运行时环境有不同的方式来管理这些东西的配置)


你有什么操作系统,你想实现什么?

动态地说,你的意思是在代码执行时更改堆栈大小吗?哎呀,那是办不到的。但是,您可以在运行应用程序之前设置堆栈大小。您可以在linux中使用“ulimit-s”命令来实现这一点,该命令将为在该shell下执行的所有进程设置堆栈大小


对于windows,同样可以在VC6中通过在项目属性->链接选项->输出->堆栈分配->保留中设置堆栈大小来完成该项目。我不知道VC8,但这样的选项可能是可用的。

一般来说,这是无法可靠完成的,因为需要为堆栈保留地址空间。如果已经在堆上分配了对象,并且地址在新的所需堆栈范围内,那么您将遇到大麻烦。在内存小于地址空间的系统上,这是可能的,但我怀疑您是否会看到许多系统允许这样做。C不需要也不支持任何此类机制。

不,这超出了C的范围。

这取决于您使用的操作系统

在Unix/Linux上,您可以对
RLIMIT\u堆栈
资源使用POSIX系统调用
setrlimit()


有关详细信息,请参见
mansetrlimit

在Linux下的单线程程序中,堆栈将自动增长,直到它在内存空间中崩溃。这通常是堆,在32位系统上,这意味着您通常可以有几GB的堆栈

在一个多线程程序中,这通常是不可能的,因为另一个线程的堆栈会挡住它

创建新线程时可以控制堆栈大小,但这通常不是一个好主意,因为任务需要多少堆栈取决于体系结构


这是相当低级的东西,主要由C库/线程库控制。胡闹会给你带来危险:)

我不太明白你的问题。调用函数或使用局部变量输入块会扩展堆栈,但这似乎不是您要寻找的答案。请注意:使用
alloca()
在当前函数中的当前stacj上获得空间。(@AProgrammer)我讨厌这样的回答:“为什么会有人这么做?”。如果你没有答案,保持沉默。他可能有理由问。其实我也有同样的问题。答案当然是:谷歌rlimit。我仍然没有windows的答案。。。现在,回答您的问题:如果他必须实现一个交互式开发环境,或者一个语言解释器,用户可以在其中输入任意脚本来执行,该怎么办。如果脚本需要大量堆栈(递归堆栈),运行时系统应该支持这一点(捕获堆栈溢出,更改限制并继续)-对吗?@blabla999:我总是很高兴有一个向下的解释投票,特别是一个好的深入的解释。经过深思熟虑,这个“探索性问题”应该是一个评论。话虽如此,就信息内容而言,你应该知道~=@kotlinski的答案。底线是,我试图帮助这个过程——有时我通过投票和在问题评论中添加“cmon,更详细”来做到这一点,有时我通过给出一半答案并继续前进来做到这一点。但我很欣赏你们的立场有着坚实的基础,并将把它作为一个更大的推动默认为评论技术,有了虚拟内存,应该可以移动东西,为堆栈的增长创造空间。因此,如果支持的话,即使多线程程序也可以有动态堆栈。