根据我的理解,下面的程序可能已经崩溃,因为释放已释放的内存,但事实并非如此。在我的Linux机器上运行。
#include <stdio.h>
#include <malloc.h>
int main(void) {
int *ptr1 = NULL;
ptr1 = malloc(100);
free(ptr1);
free(ptr1);
printf("%d\n", *ptr1);
return 0;
}
答案 0 :(得分:1)
根据free的定义,双free
实现了未定义的行为:
7.20.3.2自由功能
free函数导致ptr指向的空间被释放,即可以进一步使用 分配。如果ptr是空指针,则不执行任何操作。否则,如果 参数与calloc返回的指针不匹配, malloc,或realloc函数,或者如果空间已被释放 对free或realloc的调用,行为未定义。
未定义的行为本身在以下标准中定义:
3.4.3(1)未定义的行为
行为,使用不可移植或错误的程序构造或 错误的数据,本国际标准没有规定 要求注意可能的未定义行为包括忽略 情况完全不可预测的结果,在表现期间 以文件化的方式执行翻译或程序执行 环境(有或没有发布诊断 消息),终止翻译或执行(与发行 诊断信息)
因此,具有未定义行为的程序可能会崩溃&#34;但它也可能不会。这是未定义的......