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

在C语言中,分段错误是否只能发生在堆区域中的越界访问?或者,即使对于堆栈中的静态数组,也会发生这种情况吗?,c,debugging,segmentation-fault,ram,C,Debugging,Segmentation Fault,Ram,我从前面的答案中收集到,seg故障是由于延迟空指针或由于超出范围的数组访问而发生的。但是,这种情况是只发生在动态声明的数组中,还是也发生在静态声明的数组中?当您试图访问一个超出边界的数组时,并不总是需要出现分段错误 这完全取决于所引用的内存位置。分割是一种保护机制。当您试图进入另一个进程区域时,MMU或MPU将捕获此类访问并引发访问冲突异常(也称为分段故障)。首先,C本身不谈论分段故障,只是未定义的行为。但让我们实际一点,看看一个典型的Linux平台。如果您在一个虚拟地址访问内存,而您的进程没有

我从前面的答案中收集到,seg故障是由于延迟空指针或由于超出范围的数组访问而发生的。但是,这种情况是只发生在动态声明的数组中,还是也发生在静态声明的数组中?

当您试图访问一个超出边界的数组时,并不总是需要出现分段错误


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

首先,C本身不谈论分段故障,只是未定义的行为。但让我们实际一点,看看一个典型的Linux平台。如果您在一个虚拟地址访问内存,而您的进程没有映射,那么内核将向该进程发送SIGSEGV。在静态内存中对数组进行索引时,需要获取数组的地址,添加偏移量,然后取消对该数组的引用。如果偏移量远远超出数组的有效范围,您肯定可以到达一个未映射的地址,并且您的进程将发生故障。

因此,对于Linux上C语言中的数组,数组是静态(数据段)还是动态(堆)无关紧要。当我通过数组索引并访问程序无法访问的页面时,我只是遇到一个seg错误。这是正确的吗?是的。但是请注意,生成的地址可能恰好与程序中的其他数据匹配,因此不会导致segfault。如果可能,在valgrind下测试您的程序。找到这类问题非常好。SIGSEGV是在C标准中定义的,在一个地方,该标准还提到了“分段冲突”。感谢您提醒我注意!你说得对,SIGSEGV是在规范中定义的,在一个地方提到了“分段冲突”。关于
signal
SIGSEGV
的要求似乎不够明确,因此实现实际上不需要做任何特别的事情。不过,再次感谢你指出这一点!