houqing1999 发表于 2023-6-6 09:13:03

s1e37

https://fishc.com.cn/thread-80238-1-1.html
为什么这个代码不会陷入死循环
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
      size_t count = 0;

      while (1)
      {
                malloc(1024);
                printf("%u\n", count++);
      }
}
而这个会//只是把每次申请的粒度扩大了十倍,
……
      while (1)
      {
                malloc(10 * 1024);
                printf("%u\n", count++);
      }
……

isdkz 发表于 2023-6-6 09:20:15

这个问题的答案取决于运行这些代码的具体系统的资源和内存管理策略。首先,这两个代码实际上都有可能陷入无限循环,但是否会这样取决于系统能否提供足够的内存供 malloc 函数调用。 malloc 函数用于在堆上动态分配内存。

在第一个例子中,程序在每次循环中请求1024字节的内存。在很多系统上,这可能是一个相对较小的请求,因此系统可能能够在很长一段时间内满足这些请求,使程序看起来像是在无限循环。

然而,在第二个例子中,程序在每次循环中请求10240字节(即10KB)的内存。这是第一个例子中请求的10倍,因此系统可能更快地耗尽可用的内存。当系统无法提供更多的内存时, malloc 将返回NULL,但在你的代码中并没有检查 malloc 的返回值,因此如果 malloc 失败了,程序会继续运行,并试图分配更多的内存,这可能会导致程序崩溃或者其它错误。因此,第二个程序看起来更可能陷入无限循环,因为它更快地消耗了系统的内存。

总的来说,无论哪个版本,都应该检查 malloc 的返回值以确保内存分配成功。如果 malloc 返回NULL,那么你的程序应该采取某种行动,例如清理并退出,而不是继续试图分配更多的内存。

zhangjinxuan 发表于 2023-6-6 09:32:27

取决于您的内存配置和系统配置。

部分系统有保护机制,不会让一个程序大量申请,若大量申请,可能就直接 Killed 了。

当然,有可能会存在楼上说的,分配一直失败。
页: [1]
查看完整版本: s1e37