基础知识 | 每日一练(78)

2019-08-12 19:50:38 浏览数 (2)

基础知识练习

士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭

学生:动态分配的内存一旦释放之后你就不能再使用, 是吧?

小林:是的。有些早期的 malloc() 文档提到释放的内存中的内容会 “保留”, 但这个 欠考虑的保证并不普遍而且也不是 C 标准要求的。

几乎没有那个程序员会有意使用释放的内存, 但是意外的使用却是常有的 事。考虑下面释放单链表的正确代码:

struct list *listp, *nextp; for(listp = base; listp != NULL; listp = nextp) { nextp = listp->next; free(listp); }

请注意如果在循环表达式中没有使用临时变量 nextp, 而使用 listp = listp-> next会产生什么恶劣后果。

学生:为什么在调用 free() 之后指针没有变空?使用 (赋值, 比较) 释放之 后的指针有多么不安全?

小林:当你调用 free() 的时候, 传入指针指向的内存被释放, 但调用函数的指针值 可能保持不变, 因为 C 的按值传参语义意味着被调函数永远不会永久改变参数的值。

严格的讲, 被释放的指针值是无效的, 对它的任何使用, 即使没有解参照, 也可 能带来问题, 尽管作为一种实现质量的表现, 多数实现都不会对无伤大雅的无效指 针使用产生例外。

分享朋友圈,点下“在看”就是对小林最大的帮助!

0 人点赞