7

在 Linux 上,使用 C,假设我有一个动态确定n的命名元素的数量,我必须在一个数组int my_array[n](百字节)。

大多n是很小的,十分之几。但有时n可能很大,高达 1000 或 1'000'000。

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

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

4

2 回答 2

4

事实上,检查可用堆栈问题给出了很好的答案。

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

在您的情况下,您可以不同地处理何时n<100(然后通过alloca在堆栈上分配是有意义的)和何时n>=100(然后,使用malloc(or calloc) 在堆上分配并且不要忘记free它)的情况。使阈值 100a #define-d 恒定。

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

于 2011-12-03T06:55:30.980 回答
4

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

  1. 进入main时记录当前栈指针
  2. 在您的例程中,获取当前堆栈限制(请参阅 参考资料man getrlimit
  3. 将当前堆栈指针与步骤 1 中记录的堆栈指针之间的差异与步骤 2 中的限制进行比较。

如果您正在使用线程并且可能在主线程以外的线程上执行,请参阅man pthread_getattr_np

于 2011-12-03T17:05:15.783 回答