在 C 语言中,分段错误是否只能发生在堆区域中的越界访问?或者,即使对于堆栈中的静态数组,也会发生这种情况



我从之前关于 SO 的答案中收集到,由于引用 NULL 指针或由于越界数组访问而发生 seg 错误。但是,它只发生在动态声明的数组还是静态声明的数组上?

当您尝试越界访问数组时,并不总是需要出现分段错误。

这完全取决于所引用的内存位置。分段是一种保护机制。当您尝试进入另一个过程区域时,MMU 或 MPU 将捕获此类访问并引发访问冲突异常(也称为分段错误)。

首先,C 本身并不谈论段错误,只是不定义的行为。但是,让我们务实一点,看看一个典型的Linux平台。如果您在没有进程映射的虚拟地址上访问内存,内核会将 SIGSEGV 发送到该进程。在静态内存中的数组中索引时,获取数组的地址,添加偏移量,然后取消引用该地址。如果偏移量足够超出数组的有效范围,则绝对可以到达未映射的地址,并且您的进程将出现段错误。

相关内容

  • 没有找到相关文章

最新更新