c++ - 操作系统如何检测 C 中的超出范围的段错误?

标签 c++ c

我在学习操作系统时遇到了这个问题,我对操作系统如何检测数组索引是否超出范围从而产生段错误非常感兴趣?

int main(){
    char* ptr0;
    ptr0[0] = 1;
}

上面的代码绝对会产生段错误,因为 ptr0 没有分配任何内存。

但是如果添加一行,情况就会改变。

int main(){
    char* ptr0;
    char* ptr1 = ptr0;
    ptr0[0] = 1;
}

这段代码不会导致任何错误,即使你将ptr0[0]改为ptr0[1000],它仍然不会导致任何段错误。

我不知道为什么这条线有这样的力量

char* ptr1 = ptr0

我试图反汇编这些代码,但发现的信息很少。

有人可以从内存分配的角度向我解释一下吗?非常感谢。

最佳答案

当进程尝试访问它不应该访问的内存时会发生段错误,如果数组被读取越界,则不一定。

您的特殊情况中,变量 ptr0 未初始化,因此如果您尝试读取它,任何值都可能被读取,甚至不需要保持一致。因此,在第一个程序的情况下,读取的值恰好是无效的内存地址,并且尝试从该地址读取触发了 sigfault,而在第二个程序的情况下,读取的值恰好是有效地址程序,因此没有生成段错误。

当我运行这些程序时,两者都导致了段错误。这演示了 undefined behavior存在于试图取消引用无效指针的程序中。

当程序有未定义的行为时,C 标准不保证程序会做什么。它可能会崩溃,可能会输出意想不到的结果,或者看起来工作正常。

关于c++ - 操作系统如何检测 C 中的超出范围的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69235560/

相关文章:

c++ - 强制 CMake 将 C++ 编译器用于带有 Visual Studio 的 C 文件

c++ - 如何正确使用互斥锁?

以函数作为模板参数的 C++ 函数调用包装器

c - MPI - C - 发送数组表现得很奇怪

c++ - 为什么 std::cout 在我的输出中添加回车符或换行符?

c++ - 谷歌oauth2.0,必需的参数丢失: grant_type

c - 需要帮助在控制台应用程序中使用 Windows API 在 C 中创建我自己的 getch() 函数

c - 内存地址和内容

c++ - 从父级重定向时,到 stderr 的 DLL 输出不起作用

c - 两台Linux机器之间共享内存?