C语言 为什么不发生分段错误


#include <stdio.h>
int main(void){
  char *temp = malloc(11);
  strcpy(temp, "123456789");
  free(temp);
  printf("%cn", *temp);
  return 0;
}

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

添加一个元素来@I3x答案。

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新