【问题标题】:Attempting to access a null pointer [duplicate]尝试访问空指针[重复]
【发布时间】:2013-06-12 08:43:19
【问题描述】:
#include <iostream>

int main()
{
    int* i = 0;
    int x = (*i);
    std::cout << x;
}

当我使用Visual Studio 2010 编译和运行上面的程序时,它会崩溃,我知道它会崩溃,因为我将指针设置为 0。

我想知道的是,访问标准中定义的 C++ 中的 null pointer 还是未定义,我只是幸运地因为我的编译器/计算机/操作系统而崩溃了我的程序

如果已定义,当我尝试访问空指针时,C++ 向我保证什么?

【问题讨论】:

  • @R.MartinhoFernandes 所以我可以预计在某些计算机上这不会崩溃?
  • 是的,但您也可以期望它在其他人上格式化您的硬盘
  • @Caesar:正确。在没有内存保护方案的原始架构上,空指针通常指向地址 0,通常是可读的。
  • 在 DeathStation 9000 上,它实现了一个完全符合标准的 C++ 编译器,解除对 NULL 指针的引用会将小猫发射到太空中。
  • @KazDragon 虽然有时它会将空间投射到小猫身上。

标签: c++ pointers null


【解决方案1】:

取消引用空指针将调用未定义的行为。它可能会在不同的编译器上导致不同的事情,甚至更多——如果多次编译,在同一个编译器上可能会发生不同的事情。根本无法保证行为。

【讨论】:

    【解决方案2】:

    使您的进程在这里崩溃的原因是操作系统阻止您的程序摆弄它无权访问的内存(地址 0)。 Windows 会给你一个“访问冲突”,Linux/Unix 会给你一个“分段错误”。

    另外,请参阅 Why are NULL pointers defined differently in C and C++? 以了解标准中空指针的含义

    【讨论】:

      【解决方案3】:

      它没有在 C++ 中定义,因此它可能不会在某些操作系统上崩溃,但您可以指望在当前(和以前)版本的 Windows 和 Linux 下崩溃,因为这些都不会让您(作为用户进程)访问该内存位置。

      另外,在 Windows 下,如果你想引起程序中断,试试 DebugBreak();这会导致异常(MSDN 说:导致当前进程发生断点异常。这允许调用线程向调试器发出信号以处理异常。)

      【讨论】:

        猜你喜欢
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        • 2016-06-16
        • 1970-01-01
        相关资源
        最近更新 更多