鱼C论坛

 找回密码
 立即注册
查看: 951|回复: 2

[已解决]s1e37

[复制链接]
发表于 2023-6-6 09:13:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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++);
        }
……
最佳答案
2023-6-6 09:20:15
这个问题的答案取决于运行这些代码的具体系统的资源和内存管理策略。首先,这两个代码实际上都有可能陷入无限循环,但是否会这样取决于系统能否提供足够的内存供 malloc 函数调用。 malloc 函数用于在堆上动态分配内存。

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

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

总的来说,无论哪个版本,都应该检查 malloc 的返回值以确保内存分配成功。如果 malloc 返回NULL,那么你的程序应该采取某种行动,例如清理并退出,而不是继续试图分配更多的内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-6 09:20:15 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +3 鱼币

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

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

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

总的来说,无论哪个版本,都应该检查 malloc 的返回值以确保内存分配成功。如果 malloc 返回NULL,那么你的程序应该采取某种行动,例如清理并退出,而不是继续试图分配更多的内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-6 09:32:27 | 显示全部楼层
取决于您的内存配置和系统配置。

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

当然,有可能会存在楼上说的,分配一直失败。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 10:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表