如何在c中操纵堆栈的大小

时间:2014-03-11 04:35:40

标签: c gcc stack stack-overflow

假设我有一个c程序,我只使用堆栈变量,没有动态变量(malloc,...)

是否可以计算我的程序在运行时将占用多少内存?是否可以改变堆栈的大小?

2 个答案:

答案 0 :(得分:3)

首先,C标准对运行时堆栈没有任何说法。编译器可以自由地使用他们希望实现C行为的任何数据结构。有些人在堆上使用了链表,这很好。

所以假设我们有一个或多或少的标准C实现,它将返回地址,参数和局部变量放在堆栈上。

没有算法(因此也没有人)总能成功地正确预测任意计算机程序所需的堆栈大小。这是计算机理论的基本结果:从暂停问题中简单地减少。

但是,您可以对程序施加规则,允许预测最大尺寸堆栈。简而言之,您不允许任何形式的递归(包括一般递归:A调用B调用C调用A),并且您不在堆栈上分配可变大小的数据(例如,使用alloca()或可变大小的数组) 。

这些规则在起搏器和飞行控制等安全关键系统中非常常见。它们可以通过软件工具进行检查,这些工具可用于安全关键系统设计,但它们往往是专有的。

正如@Jonathon Reinhart所说,每个操作系统建立堆栈大小的过程是不同的。

Linux和Unix变体使用rlimitulimit方案,其中堆栈大小是用户资源约束。

Windows将堆栈限制与每个程序相关联。您也可以使用Job Objects获取rlimit - 就像控件一样。

相反,我不知道是否有类似Windows的方法来设置Linux可执行文件中的堆栈大小限制,但是如果知道有可执行文件,就不会感到惊讶。

答案 1 :(得分:2)

在Linux上,您可以使用setrlimit(RLIMIT_STACK,...)更改堆栈大小限制。

在Windows上,堆栈大小在线程初始化时设置,通过dwStackSize参数设置为CreateThread。要在编译时更改它,请将/F (Set Stack Size)传递给编译器