当C中的静态分配没有足够的内存时会发生什么?

时间:2012-11-18 09:19:46

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

根据系统的不同,程序会立即失败并出现分段错误,否则会因堆栈和堆启动满足时发生的内存损坏而死亡。