C 发生堆栈溢出之前剩余堆栈的大小

C 发生堆栈溢出之前剩余堆栈的大小,c,linux,stack,stack-size,C,Linux,Stack,Stack Size,在Linux上,使用C,假设我有一个动态确定的n来命名我必须在一个数组中存储的元素数量(int my_array[n]),只需要很短的时间,比如说一次函数调用,调用的函数只使用很少的内存(大约一百字节) 大多数情况下,n很少,大约十分之一。但有时n可能很大,高达1000或1000 如何计算堆栈是否可以容纳n*o+p字节而不会溢出 基本上:我的堆栈上还有多少字节?的确,这个问题给出了很好的答案 但更务实的答案是:不要在调用堆栈上分配大数据 在您的情况下,当n=100(然后,使用malloc(或ca

在Linux上,使用C,假设我有一个动态确定的
n
来命名我必须在一个数组中存储的元素数量(
int my_array[n]
),只需要很短的时间,比如说一次函数调用,调用的函数只使用很少的内存(大约一百字节)

大多数情况下,
n
很少,大约十分之一。但有时
n
可能很大,高达1000或1000

如何计算堆栈是否可以容纳
n*o+p
字节而不会溢出

基本上:我的堆栈上还有多少字节?

的确,这个问题给出了很好的答案

但更务实的答案是:不要在调用堆栈上分配大数据

在您的情况下,当
n=100
(然后,使用
malloc
(或
calloc
)在堆上分配)时,您可以以不同的方式处理这种情况,并且不要忘记
释放它。使阈值
100
a
#define
-d恒定


在当前的笔记本电脑或台式机上,上的典型调用帧最多应该是几千字节(如果有递归或线程,最好是更少)。总堆栈空间通常最多为几兆字节(有时更少:在内核中,每个堆栈通常为4KB!)。

如果您不使用线程,或者您知道代码在主堆栈上执行,那么

  • 在进入main时记录当前堆栈指针
  • 在例程中,获取当前堆栈限制(请参见
    mangetrlimit
  • 将当前堆栈指针和步骤1中记录的指针之间的差值与步骤2中的限值进行比较

  • 如果您使用的是线程,并且可以在主线程以外的线程上执行,请参阅
    man pthread\u getattr\u np

    可能重复@BrendanLong,我看到了这个问题,但当它声明“我正在使用MinGW和GCC 3.4.5(MinGW special vista r3)”时,答案有点以Windows为中心。我的问题是Linux/*以nix为中心。;-)为什么你不能使用
    getrusage()
    getrlimit()
    ?@sverre,如果你能给我解释一下getrusage和getrlimit,我会很高兴的。的手册页上写着“ru_isrss(未维护)此字段当前在Linux上未使用”。@kay-查看该页上的第四个响应。混合使用
    calloc
    alloca
    是个坏消息,因为其中一个初始化了数据,而另一个没有。这可能会引入奇怪的bug。好吧,可能是
    malloc
    &
    alloca