在 Linux 上,使用 C,假设我有一个动态确定n
的命名元素的数量,我必须在一个数组int my_array[n]
(百字节)。
大多n
是很小的,十分之几。但有时n
可能很大,高达 1000 或 1'000'000。
如何计算我的堆栈是否可以容纳n*o + p
字节而不溢出?
基本上:我的堆栈上还剩下多少字节?
在 Linux 上,使用 C,假设我有一个动态确定n
的命名元素的数量,我必须在一个数组int my_array[n]
(百字节)。
大多n
是很小的,十分之几。但有时n
可能很大,高达 1000 或 1'000'000。
如何计算我的堆栈是否可以容纳n*o + p
字节而不溢出?
基本上:我的堆栈上还剩下多少字节?
事实上,检查可用堆栈问题给出了很好的答案。
但更务实的答案是:不要在调用堆栈上分配大数据。
在您的情况下,您可以不同地处理何时n<100
(然后通过alloca在堆栈上分配是有意义的)和何时n>=100
(然后,使用malloc
(or calloc
) 在堆上分配并且不要忘记free
它)的情况。使阈值 100
a #define
-d 恒定。
在当前的笔记本电脑或台式机上,调用堆栈上的典型调用帧最多应为几千字节(如果您有递归或线程,最好更少)。总堆栈空间通常最多只有几兆字节(有时甚至更少:在内核内部,堆栈通常每个 4 KB!)。
如果您没有使用线程,或者如果您知道您的代码在主堆栈上执行,那么
man getrlimit
)如果您正在使用线程并且可能在主线程以外的线程上执行,请参阅man pthread_getattr_np