我原来以为访问非法内存地址是非法的,包括0地址, 今天才发现,free 是个例外, 可以free 0地址.
当然,向0地址写内容是非法的.
测试代码如下:
$ cat main.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
free(0);
printf("pass test 0\n");
free((void *)1);
printf("pass test 1\n");
return 0;
}
运行结果如下:
./mem
pass test 0
段错误
可见,free(0) 地址是允许的. 这为当指针为空时,运行再一次释放提供了方便.