我从之前关于 SO 的答案中收集到,由于引用 NULL 指针或由于越界数组访问而发生 seg 错误。但是,它只发生在动态声明的数组还是静态声明的数组上?
当您尝试越界访问数组时,并不总是需要出现分段错误。
这完全取决于所引用的内存位置。分段是一种保护机制。当您尝试进入另一个过程区域时,MMU 或 MPU 将捕获此类访问并引发访问冲突异常(也称为分段错误)。
首先,C 本身并不谈论段错误,只是不定义的行为。但是,让我们务实一点,看看一个典型的Linux平台。如果您在没有进程映射的虚拟地址上访问内存,内核会将 SIGSEGV 发送到该进程。在静态内存中的数组中索引时,获取数组的地址,添加偏移量,然后取消引用该地址。如果偏移量足够超出数组的有效范围,则绝对可以到达未映射的地址,并且您的进程将出现段错误。