关于CSAPP练习题 3.46 E. 的一点笔记
先放原题
这次,我们主要关注E小问:
习题及答案中提到函数存在两处错误:
对malloc的调用应该以
strlen(buf) + 1
作为它的参数,而且代码还应该检查返回值是否为NULL。——参考自csapp第三版第12次印刷,p240
但是在勘误(见 https://csapp3e.gitee.io/yiligong_homepage/csapp3e/index.html )中提到
代码还应该检查返回值是否为NULL
修改为> 代码还应该检查gets的返回值,确保它不为NULL
这让我有点在意。
后面查证了一下,首先malloc()
函数在分配失败的时候会返回NULL
,如果不加检查,直接向strcpy()
的src
中传入空指针会引发错误,书上原本的答案肯定没问题
那么现在关注一下gets()
函数:这个危险的函数我没有查到太多的资料,目前查到的部分提到gets()
在读取失败和“没有读入内容就遇到文件结尾(EOF)”时会返回NULL
,并且此种情况下可能不会改变原本gets()
函数写入目的地的值——同时本题给出的代码中,buf
数组并非初始化,可能存在内存脏数据,这时使用strlen
可能会读取内存脏数据,显然也是我们不允许的。
故推测本题E的题干应订正为3处错误,包含一处malloc函数参数过小和两处指针未进行空指针检查
标签:练习题,3.46,CSAPP,gets,勘误,malloc,NULL From: https://www.cnblogs.com/kkkah/p/16596876.html