4

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

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

4

1 回答 1

5

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

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

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

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

于 2012-11-18T10:44:10.837 回答