a905448839 发表于 2023-4-19 20:38:35

对于以下代码段,正确的说法是?

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

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


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


C.
程序会一直运行下去


D.
程序不能被编译

isdkz 发表于 2023-4-19 20:41:49

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

这段代码会不断分配1字节的内存空间并将分配的内存地址赋值给指针p,然后将该内存地址处的值设为0。随着内存不断被分配,最终可能导致系统内存耗尽,从而使程序退出。这里没有适当的内存释放操作,因此会导致内存泄漏。

sfqxx 发表于 2023-4-19 20:48:33

选项C是正确的:程序会一直运行下去。

原因是,在while循环中,程序会不断地分配内存空间,并将该空间存储的值赋为0。由于没有释放这些内存,内存使用量会不断增加,最终可能导致内存耗尽或者操作系统出现问题,但是程序并没有退出或崩溃的语句,所以程序会一直运行下去。

a905448839 发表于 2023-4-19 22:44:46

isdkz 发表于 2023-4-19 20:41
A.
最终程序会因为没有空间了而退出



到底是谁错了呢。。这题出自中国大学MOOC翁恺老师的课后题,答案是B

a905448839 发表于 2023-4-19 22:44:58

sfqxx 发表于 2023-4-19 20:48
选项C是正确的:程序会一直运行下去。

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

到底是谁错了呢。。这题出自中国大学MOOC翁恺老师的课后题,答案是B

dolly_yos2 发表于 2023-4-19 23:18:02

其实 A 和 B 都是有可能的,比如如果内存开销过高操作系统不满意了 OOM killer 可能就要出场了,那程序就可能因为没有空间而被杀死,这就是 A;另一种可能是无法分配内存了那 malloc 会返回 NULL,不加检查的写入就可能因为向0地址写入而退出,也就是 B

a905448839 发表于 2023-4-19 23:50:27

dolly_yos2 发表于 2023-4-19 23:18
其实 A 和 B 都是有可能的,比如如果内存开销过高操作系统不满意了 OOM killer 可能就要出场了,那程序就可 ...

这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的1+1+1+1+1。。。 才会出现无法成功分配内存空间?

a905448839 发表于 2023-4-19 23:51:00

sfqxx 发表于 2023-4-19 20:48
选项C是正确的:程序会一直运行下去。

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

这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的1+1+1+1+1。。。 才会出现无法成功分配内存空间?

a905448839 发表于 2023-4-19 23:52:47

isdkz 发表于 2023-4-19 20:41
A.
最终程序会因为没有空间了而退出



这个循环里,每次都是分配的1字节空间吗(他永远是1字节的内存空间)?还是说每一次分配内存空间都是叠加的1+1+1+1+1。。。 才会出现无法成功分配内存空间?

isdkz 发表于 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是正确答案。

a905448839 发表于 2023-4-19 23:58:27

isdkz 发表于 2023-4-19 23:54
这个循环里,每次都是分配1字节的空间。但是,由于这是一个无限循环,每次循环都会分配一个新的1字节空 ...


为什么答案是B呢?

小甲鱼 发表于 2023-4-20 02:12:22

这道题嘛,会因为不同编译环境和系统环境而导致不同的结果

dolly_yos2 发表于 2023-4-20 09:19:16

总结:这是一道垃圾题目,就像我之前说的,多个选项都有可能发生。

a905448839 发表于 2023-4-20 09:28:24

小甲鱼 发表于 2023-4-20 02:12
这道题嘛,会因为不同编译环境和系统环境而导致不同的结果

谢谢老师的回复!你的教学课程讲的很好!

a905448839 发表于 2023-4-20 09:28:50

dolly_yos2 发表于 2023-4-20 09:19
总结:这是一道垃圾题目,就像我之前说的,多个选项都有可能发生。

好的,谢谢你
页: [1]
查看完整版本: 对于以下代码段,正确的说法是?