鱼C论坛

 找回密码
 立即注册
查看: 2343|回复: 14

[已解决]对于以下代码段,正确的说法是?

[复制链接]
发表于 2023-4-19 20:38:35 | 显示全部楼层 |阅读模式

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

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

x
对于以下代码段,正确的说法是:
char *p;
while (1) {
    p = malloc(1);
    *p = 0;
}

A.
最终程序会因为没有没有空间了而退出


B.
最终程序会因为向0地址写入而退出


C.
程序会一直运行下去


D.
程序不能被编译
最佳答案
2023-4-19 23:18:02
其实 A 和 B 都是有可能的,比如如果内存开销过高操作系统不满意了 OOM killer 可能就要出场了,那程序就可能因为没有空间而被杀死,这就是 A;另一种可能是无法分配内存了那 malloc 会返回 NULL,不加检查的写入就可能因为向0地址写入而退出,也就是 B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-19 20:41:49 | 显示全部楼层
A.
最终程序会因为没有空间了而退出

这段代码会不断分配1字节的内存空间并将分配的内存地址赋值给指针p,然后将该内存地址处的值设为0。随着内存不断被分配,最终可能导致系统内存耗尽,从而使程序退出。这里没有适当的内存释放操作,因此会导致内存泄漏。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-19 20:48:33 | 显示全部楼层
选项C是正确的:程序会一直运行下去。

原因是,在while循环中,程序会不断地分配内存空间,并将该空间存储的值赋为0。由于没有释放这些内存,内存使用量会不断增加,最终可能导致内存耗尽或者操作系统出现问题,但是程序并没有退出或崩溃的语句,所以程序会一直运行下去。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 22:44:46 | 显示全部楼层
isdkz 发表于 2023-4-19 20:41
A.
最终程序会因为没有空间了而退出

到底是谁错了呢。。这题出自中国大学MOOC翁恺老师的课后题,答案是B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 22:44:58 | 显示全部楼层
sfqxx 发表于 2023-4-19 20:48
选项C是正确的:程序会一直运行下去。

原因是,在while循环中,程序会不断地分配内存空间,并将该空间存 ...

到底是谁错了呢。。这题出自中国大学MOOC翁恺老师的课后题,答案是B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-19 23:18:02 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
其实 A 和 B 都是有可能的,比如如果内存开销过高操作系统不满意了 OOM killer 可能就要出场了,那程序就可能因为没有空间而被杀死,这就是 A;另一种可能是无法分配内存了那 malloc 会返回 NULL,不加检查的写入就可能因为向0地址写入而退出,也就是 B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 23:50:27 From FishC Mobile | 显示全部楼层
dolly_yos2 发表于 2023-4-19 23:18
其实 A 和 B 都是有可能的,比如如果内存开销过高操作系统不满意了 OOM killer 可能就要出场了,那程序就可 ...

这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的1+1+1+1+1。。。 才会出现无法成功分配内存空间?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 23:51:00 From FishC Mobile | 显示全部楼层
sfqxx 发表于 2023-4-19 20:48
选项C是正确的:程序会一直运行下去。

原因是,在while循环中,程序会不断地分配内存空间,并将该空间存 ...

这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的1+1+1+1+1。。。 才会出现无法成功分配内存空间?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 23:52:47 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-4-19 20:41
A.
最终程序会因为没有空间了而退出


这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的1+1+1+1+1。。。 才会出现无法成功分配内存空间?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-19 23:54:13 | 显示全部楼层
a905448839 发表于 2023-4-19 23:52
这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的 ...


这个循环里,每次都是分配1字节的空间。但是,由于这是一个无限循环,每次循环都会分配一个新的1字节空间,并且这些空间没有被释放。

因此,随着循环次数的增加,已分配的内存空间会累积起来,呈现出1+1+1+1+1...这样的累积效应。

最终,当系统没有足够的内存来分配给程序时,malloc将返回NULL,导致程序可能因尝试访问NULL指针而崩溃。这就是为什么选项A是正确答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 23:58:27 | 显示全部楼层
isdkz 发表于 2023-4-19 23:54
这个循环里,每次都是分配1字节的空间。但是,由于这是一个无限循环,每次循环都会分配一个新的1字节空 ...

97ab76072f8d49ea8ef8e8d6b52fcdc.png
为什么答案是B呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-20 02:12:22 | 显示全部楼层
这道题嘛,会因为不同编译环境和系统环境而导致不同的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-20 09:19:16 | 显示全部楼层
总结:这是一道垃圾题目,就像我之前说的,多个选项都有可能发生。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-20 09:28:24 From FishC Mobile | 显示全部楼层
小甲鱼 发表于 2023-4-20 02:12
这道题嘛,会因为不同编译环境和系统环境而导致不同的结果

谢谢老师的回复!你的教学课程讲的很好!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-20 09:28:50 From FishC Mobile | 显示全部楼层
dolly_yos2 发表于 2023-4-20 09:19
总结:这是一道垃圾题目,就像我之前说的,多个选项都有可能发生。

好的,谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 22:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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