【问题标题】:What't there at address 0 usually地址 0 通常没有什么
【发布时间】:2015-01-27 02:33:08
【问题描述】:

我已经尝试了以下代码。但它总是崩溃。为什么?我什至没有更改地址 0 的内容。 在mingw32-g++上编译

#include<iostream>
int main(){
    int* p=0;
    std::cout<<*p;
}

【问题讨论】:

  • Why? 因为未定义的行为。
  • "我连地址0的内容都没改。"阅读它足以使其成为未定义的行为。在某些情况下,这可能会导致崩溃。
  • 我知道这是 C++ 标准的未定义行为。我想知道编译器通常如何处理它@remyabel
  • @Nya,嗯?编译器编写取消引用第零页的程序集,然后您的操作系统(假设您在远程现代操作系统的用户空间中)拒绝将其提供给您,并通过 SIGSEGV 告诉您。编译器实际上并没有在那里做出任何决定。

标签: c++


【解决方案1】:

取消引用空指针会产生未定义的行为。

在一个相当典型的情况下,那里真的什么都没有。例如,在保护模式下的 x86 上,您通常会为内存的开头设置一些页表条目,说明那里没有任何内容,因此任何读取或写入该地址的尝试都将导致页面错误(例如,Windows Linux 会这样做)。

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 2018-06-21
    • 2013-05-16
    • 2020-05-23
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多