为什么不会发生分段错误?

Why segmentation fault does not occur?

#include <stdio.h>

int main(void){
  char *temp = malloc(11);
  strcpy(temp, "123456789");
  free(temp);
  printf("%c\n", *temp);
  return 0;
}

在上面的代码中,为什么我在访问尚未分配的内存时没有出现分段错误。而且打印出来的字符是空的?不应该是1吗?

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

正在向@I3x 答案添加一个元素。

例如,与取消引用 NULL 不同,从同一进程的 malloc 取消引用地址 - 即使该地址刚刚被释放 - 也是从虚拟地址取消引用地址 space 的进程,is/was 刚才对进程可见的地址。因此,在这种情况下,触发段错误的可能性较小。

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

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

无论如何,"cheat" 系统没有理由继续使用已归还给 OS 的内存区域。

再重复一遍:"likeness" 表示未定义的行为。您可能不会遇到段错误,您可能会遇到一个。字节可能会更改,也可能不会。但是,无论如何,在 free 之后,该内存 not 不再可用。完全没有。别这样。