Q为什么调用 free 后指针不是 NULL?free?
释放指针后使用(赋值、比较)指针值有多不安全?
A当你调用free时,传递给它的指针所指向的内存会被释放,但调用者中的指针的值很可能保持不变,因为 C 的传值语义意味着被调用的函数永远不会永久性地改变其参数的值。(另请参见问题 4.8。)
严格来说,已被释放的指针值是无效的,并且任何对其的使用,即使它没有被解引用(即,即使使用它看似无害的赋值或比较),理论上都可能导致问题。(我们可以假设,作为实现质量问题,大多数实现都不会刻意为无效指针的无害使用生成异常,但标准明确表示没有什么可以保证,并且存在一些系统架构,对于这些架构来说,此类异常是很自然的。)
当指针变量(或结构中的字段)在程序中被反复分配和释放时,通常在释放后立即将其设置为 NULL,以明确记录它们的状态,这会很有用。
参考:ISO Sec. 7.10.3
Rationale 第 3.2.2.3 节