C语言中静态分配内存不足时会发生什么?

4
当您动态分配内存时,例如 malloc(1024 * sizeof(char)),如果没有足够的可用内存来满足请求,则会将结果指针设置为 NULL
当没有足够的内存满足静态分配(例如char c[1024])时会发生什么?

1
有没有任何方法可以捕捉到这个错误? - DanielGibbs
3
更确切地说,调用栈溢出。 - John Dvorak
为了解决这个问题,不要在调用栈上分配大数组 => 使用mallocnew - John Dvorak
1
如果你指的是嵌入式系统,那么堆栈空间可以与堆空间共享。在这种情况下,静态分配可以节省一些字节。另一方面,动态分配失败可以更优雅地处理。 - John Dvorak
2
如果它是全局的,程序就不能启动。如果它是局部的,它会导致堆栈溢出。你处理不了这些错误。 - frp
显示剩余4条评论
1个回答

5

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

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

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

根据系统不同,程序要么会立即因段错误而失败,要么会由于堆栈和堆开始相遇而死亡。


在某些情况下(没有VLA或递归),应该可以静态确定所需的堆栈大小;工具是否这样做? - Kos
普通的编译器和集成开发环境不会这样做,部分原因是因为它们无法知道目标堆栈大小(也可以配置)。 - user4815162342

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接