为什么不发生分段错误?

时间:2015-12-12 10:00:25

标签: c segmentation-fault malloc free

{{1}}

在上面的代码中,为什么我没有因为访问尚未分配的内存而出现分段错误。打印出来的角色是空的?难道不是1吗?

2 个答案:

答案 0 :(得分:3)

指针free() temp后,其值不确定。访问它是undefined behaviour。无法保证未定义的行为会导致分段错误。

答案 1 :(得分:3)

向@ I3x答案添加元素。

与解除引用NULL不同,例如,从同一进程中解除引用来自 malloc 的地址 - 即使刚刚释放了地址 - 也是从进程的虚拟地址空间解除引用地址的地址刚才可以看到这个过程。因此,在这种情况下,它不太可能触发段错误。

然而,在 free 运行之后,操作系统认为该段内存未使用,准备再次分配或甚至由内存分配系统本身立即使用。这可能就是为什么在 free 发生之后你在该位置获得了不同的值。

该段可能被分配给另一个进程,或者对最初分配它的进程不可用,从而触发页面错误=>段错误。

无论如何,没有理由"作弊"系统试图继续使用已经返回操作系统的内存区域。

再次重复:"相似"意味着未定义的行为。你可能不会得到一个段错误,你可能得到一个。字节可能会更改,但可能不会。但是,无论如何,在 free 之后,该内存 不再可用。完全没有。不要这样做。