为啥可以用空指针调用free?
Posted
技术标签:
【中文标题】为啥可以用空指针调用free?【英文标题】:Why is it okay to call free with null pointer?为什么可以用空指针调用free? 【发布时间】:2022-01-11 17:56:42 【问题描述】:从 C 标准中可以清楚地看出,NULL
是free()
的可接受输入,结果是不执行任何操作。但是,这似乎违反了 free()
只能在使用 malloc()
、calloc()
或 realloc()
显式分配的内存上调用的想法。
这个异常背后的原因是什么?我能想到的唯一原因是,调用者不必在调用free()
之前明确检查NULL
。
【问题讨论】:
NULL
是来自malloc
和朋友的有效返回值。所以任何构造 free(malloc(...))
都是有效的。
很难回答有关编程语言推理的问题。 not 允许free(NULL)
有什么好处?在这种情况下您会遇到什么错误?
【参考方案1】:
如果请求的大小为 0,malloc
函数(以及 calloc
和 realloc
)可能会返回 NULL 指针。因此,NULL 指针也可以传递给 free
是有意义的,因为它从成功调用malloc
返回:
C standard 的第 7.22.3p1 节指定了这种行为:
如果无法分配空间,则返回空指针。如果 请求的空间大小为零,行为是 实现定义:要么返回一个空指针,要么 行为就像大小是一些非零值,除了 返回的指针不能用于访问对象。
【讨论】:
以上是关于为啥可以用空指针调用free?的主要内容,如果未能解决你的问题,请参考以下文章
java String.valueOf(null)为啥会报空指针