当您动态分配内存时,例如
当没有足够的内存满足静态分配(例如
malloc(1024 * sizeof(char))
,如果没有足够的可用内存来满足请求,则会将结果指针设置为 NULL
。当没有足够的内存满足静态分配(例如
char c[1024]
)时会发生什么?malloc(1024 * sizeof(char))
,如果没有足够的可用内存来满足请求,则会将结果指针设置为 NULL
。char c[1024]
)时会发生什么?char c[1024]
不一定是静态分配,它是静态或自动的,具体取决于声明是写在函数体内(没有static
修饰符)还是在顶层。
静态分配在运行时不会失败,因为程序执行时已经保留了分配空间。如果无法保留足够的内存,程序将无法加载(Unix上的exec*
将失败)。在病态情况下,操作系统可能会过度分配内存,并且只有在访问后才会保留它。在这种情况下,分配失败将导致进程立即被系统终止。
自动分配只是将堆栈边缘向下移动,通常通过递减堆栈指针寄存器来实现。 (这就是为什么本地变量的分配如此快的原因。) C程序没有可移植的机制来检测堆栈是否增长过大。一些操作系统将在MMU检测到您已超过分配限制时自动增加堆栈;Linux对主线程执行此操作,但不对进程中的其他线程执行此操作。即便如此,足够的堆栈分配迟早会超过系统限制或耗尽系统内存,程序将失败。
根据系统不同,程序要么会立即因段错误而失败,要么会由于堆栈和堆开始相遇而死亡。
malloc
或new
。 - John Dvorak