在标准C中,参数传递是按值.所以函数不能改变其参数的值(这不是特定的free).每次通话都是按价值进行的通话.如果在函数内部更改某个参数,则只更改该参数的本地副本(例如,在某些机器寄存器中),并且调用者不会看到任何更改.
如果你想改变一些东西,你会将那个东西的地址作为一个值传递,你将取消引用该指针.
因此free不会更改传递给它的指针,但您需要确保永远不再使用该指针.否则,这是未定义的行为.一种常见的风格是编码free(ptr), ptr=NULL;(这样任何进一步的访问ptr都会因分段错误而崩溃).
实际上,C标准库的大多数实现都标记了free-d区域,以便将来可以重用malloc.但有时(特别是在释放大内存区域时)内存被释放到内核(例如,通过Linux上的munmap(2)).内存区域真正发生的是特定于实现的.
另请参阅一些免费软件 C标准库实现的源代码(例如,大多数libc在Linux上,例如musl-libc或GNU libc ...).使用所有警告和调试信息编译代码(例如,gcc -Wall -Wextra -g如果使用GCC ......)然后使用valgrind来捕获内存泄漏错误.