【问题标题】:What happens when there is not enough memory for a static allocation in C?当 C 中没有足够的内存用于静态分配时会发生什么?
【发布时间】:2012-11-18 09:19:45
【问题描述】:

当您动态分配内存时,例如malloc(1024 * sizeof(char)) 如果没有足够的可用内存来满足请求,则结果指针将设置为 NULL

当没有足够的内存来满足char c[1024] 等静态分配时会发生什么?

【问题讨论】:

  • 有什么办法可以捕捉到这个吗?
  • 更准确地说,调用堆栈溢出。
  • 处理它,不要在调用堆栈上分配大数组=>使用mallocnew
  • @DanielGibbs 如果您指的是嵌入式系统,那么堆栈空间可以与堆空间共享。在这种情况下,静态分配可以节省几个字节。另一方面,动态分配失败可以更优雅地处理。
  • 如果是全局的,程序就无法启动。如果它是本地的,则会导致堆栈溢出。您无法处理这些错误。

标签: c memory-management static-memory-allocation


【解决方案1】:

char c[1024] 不一定是静态分配,它是静态的还是自动的,具体取决于声明是写在函数体内(没有 static 修饰符)还是顶层。

静态分配不会在运行时失败,因为分配空间是在程序执行时保留的。如果无法保留足够的内存,程序将无法加载(exec* 在 Unix 上将失败)。在病态的情况下,内存可能会被操作系统过度使用,系统只会在访问时保留它。在这种情况下,分配失败将导致进程立即被系统获取killed

自动分配只是将堆栈的边缘向下移动,通常通过递减堆栈指针寄存器。 (这就是局部变量分配如此之快的原因。)C 程序没有可移植的机制来检测堆栈是否变得太大。一旦 MMU 检测到您已通过分配的限制,某些操作系统会自动增大堆栈; Linux 对主线程执行此操作,但不会对进程中的其他线程执行此操作。即便如此,足够的堆栈分配迟早会超过系统限制,或者会耗尽系统的内存,程序将失败。

根据系统的不同,程序要么会立即因分段错误而失败,要么会因堆栈和堆开始相遇时发生的内存损坏而死。

【讨论】:

  • 在某些情况下(没有 VLA 或递归)应该可以静态确定所需的堆栈大小;工具能做到吗?
  • 普通编译器和 IDE 不这样做,部分原因是它们无法知道目标堆栈大小(也可配置)。
猜你喜欢
  • 2023-03-19
  • 2019-11-18
  • 2014-04-24
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2013-09-07
  • 1970-01-01
相关资源
最近更新 更多