1

在像 GNU/Linux 这样可靠的真正 POSIX 系统上,超出数组大小的数组索引是否总是会导致分段错误?

我认为不,如果访问的位置仍然位于同一页面中,但要确定。

4

1 回答 1

5

不,不一定。Segmentation ViolationsSIGSEGV由内核处理,并且只会在无效的内存访问时调用。

与 POSIX 一样,数组是编译时构造。另一方面,Segmentation Violation 是一个运行时错误,表明您尝试使用一块您不允许(读/写/执行)或尚未映射(内存控制器不知道)的虚拟内存做某事应该有什么物理资源来支持它)。此时内核将向您的进程发送一个信号SiGSEGV,并且默认行为是退出,尽管可以覆盖它。

你甚至会经常看到这样的 C 代码,它指示编译器以可变大小数组的形式访问结构后面的内存:

struct s {
    // some other elements
    int id; // whatever other elements

    char appended_array[0];
};

// ....

struct s* mystruct = malloc(sizeof(struct s) + length_of_array_i_need);

// work with mystruct->appended_array[i]
// at this point mystruct->appended_array[3] is valid C and the compiler will not even issue a warning,
// though if it lies outside of your allowed VM then the kernel will issue a SIGSEGV

只是因为数组没有定义超出某个索引,并不一定意味着它后面没有有效的内存。

于 2012-11-30T12:31:30.983 回答