为什么我们不应该在C中动态分配堆栈上的内存?

rsj*_*ani 1 c

我们有在Windows和Linux系统中在堆栈上分配内存的功能,但是不鼓励它们使用它们也不是C标准的一部分?这意味着它们提供了一些非标准行为.由于我没有经验,我无法理解从堆栈分配内存而不是使用堆时可能出现的问题?

谢谢.

编辑:我的观点:由于Delan已经解释过分配给程序的堆栈数量是在编译期间决定的,所以如果我们用完它就不能从操作系统中请求更多的堆栈.唯一的出路就是崩溃.所以最好留下堆栈来存储诸如变量,函数,函数调用,数组,结构等主要内容,并使用堆与OS /机器的容量一样多.

Del*_*ani 5

堆栈内存的优点是,堆内存的分配速度通常更快.

然而,至少在特定情况下,其问题alloca(3)在于,在许多实现中,它仅减少堆栈指针,而不考虑或通知是否实际上存在任何堆栈空间.

堆栈内存在编译或运行时固定,并且在需要更多内存时不会动态扩展.如果用完堆栈空间并调用alloca,则有可能获得指向非堆栈内存的指针.您无法知道是否导致堆栈溢出.


附录:这并不意味着我们不应该使用动态分配堆栈内存; 如果你是

  • 在严格控制和监控的环境中,例如嵌入式应用程序,其中堆栈限制是已知的或能够设置的
  • 仔细跟踪所有内存分配以避免堆栈溢出
  • 确保您没有足够的递归导致堆栈溢出

然后堆栈分配很好,甚至可以有利于节省时间(堆栈指针的运动发生的一切)和内存(你正在使用预先分配的堆栈,而不是进入堆中).