对于以下代码段,正确的说法是?
对于以下代码段,正确的说法是:char *p;
while (1) {
p = malloc(1);
*p = 0;
}
A.
最终程序会因为没有没有空间了而退出
B.
最终程序会因为向0地址写入而退出
C.
程序会一直运行下去
D.
程序不能被编译 A.
最终程序会因为没有空间了而退出
这段代码会不断分配1字节的内存空间并将分配的内存地址赋值给指针p,然后将该内存地址处的值设为0。随着内存不断被分配,最终可能导致系统内存耗尽,从而使程序退出。这里没有适当的内存释放操作,因此会导致内存泄漏。 选项C是正确的:程序会一直运行下去。
原因是,在while循环中,程序会不断地分配内存空间,并将该空间存储的值赋为0。由于没有释放这些内存,内存使用量会不断增加,最终可能导致内存耗尽或者操作系统出现问题,但是程序并没有退出或崩溃的语句,所以程序会一直运行下去。 isdkz 发表于 2023-4-19 20:41
A.
最终程序会因为没有空间了而退出
到底是谁错了呢。。这题出自中国大学MOOC翁恺老师的课后题,答案是B sfqxx 发表于 2023-4-19 20:48
选项C是正确的:程序会一直运行下去。
原因是,在while循环中,程序会不断地分配内存空间,并将该空间存 ...
到底是谁错了呢。。这题出自中国大学MOOC翁恺老师的课后题,答案是B 其实 A 和 B 都是有可能的,比如如果内存开销过高操作系统不满意了 OOM killer 可能就要出场了,那程序就可能因为没有空间而被杀死,这就是 A;另一种可能是无法分配内存了那 malloc 会返回 NULL,不加检查的写入就可能因为向0地址写入而退出,也就是 B dolly_yos2 发表于 2023-4-19 23:18
其实 A 和 B 都是有可能的,比如如果内存开销过高操作系统不满意了 OOM killer 可能就要出场了,那程序就可 ...
这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的1+1+1+1+1。。。 才会出现无法成功分配内存空间? sfqxx 发表于 2023-4-19 20:48
选项C是正确的:程序会一直运行下去。
原因是,在while循环中,程序会不断地分配内存空间,并将该空间存 ...
这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的1+1+1+1+1。。。 才会出现无法成功分配内存空间? isdkz 发表于 2023-4-19 20:41
A.
最终程序会因为没有空间了而退出
这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的1+1+1+1+1。。。 才会出现无法成功分配内存空间? a905448839 发表于 2023-4-19 23:52
这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的 ...
这个循环里,每次都是分配1字节的空间。但是,由于这是一个无限循环,每次循环都会分配一个新的1字节空间,并且这些空间没有被释放。
因此,随着循环次数的增加,已分配的内存空间会累积起来,呈现出1+1+1+1+1...这样的累积效应。
最终,当系统没有足够的内存来分配给程序时,malloc将返回NULL,导致程序可能因尝试访问NULL指针而崩溃。这就是为什么选项A是正确答案。 isdkz 发表于 2023-4-19 23:54
这个循环里,每次都是分配1字节的空间。但是,由于这是一个无限循环,每次循环都会分配一个新的1字节空 ...
为什么答案是B呢? 这道题嘛,会因为不同编译环境和系统环境而导致不同的结果 总结:这是一道垃圾题目,就像我之前说的,多个选项都有可能发生。 小甲鱼 发表于 2023-4-20 02:12
这道题嘛,会因为不同编译环境和系统环境而导致不同的结果
谢谢老师的回复!你的教学课程讲的很好! dolly_yos2 发表于 2023-4-20 09:19
总结:这是一道垃圾题目,就像我之前说的,多个选项都有可能发生。
好的,谢谢你
页:
[1]